{ }codelper
求和P0342

轮流投出的飞镖得分

智宇和敏书轮流投飞镖,每次投一支。
智宇先投,接着敏书投,然后又是智宇投,这个顺序一直持续到最后。
第一行给出两人投掷次数的总和 n。
第二行按投掷顺序给出每次投掷得到的 n 个分数,相邻两个之间用一个空格隔开。
按这个顺序输出智宇得分的总和与敏书得分的总和,两者用一个空格隔开,占一行。
当 n 为 1 时,敏书一次也没有投,所以敏书的总和是 0。

输入
1 ≤ n ≤ 1,000,0 ≤ 分数 ≤ 10,000(整数,只给出数字,不带逗号)
输出
一行,智宇的总和与敏书的总和,用一个空格隔开
样例 1 · stdin
5
3 7 5 0 10
stdout
18 7
样例 2 · stdin
1
8
stdout
8 0
main.py
输入(stdin)

运行时这些行会依次作为 input()/标准输入传入(运行中不会等待输入)。

$ 就绪

请在电脑上打开以编写和运行代码。在手机上可以查看题目和题解。

其他语言怎么写?查看各语言题解 · 8 种语言题解

隔一个加一个的写法,各语言不一样。
Python 像 sum(a[0::2]) 和 sum(a[1::2]) 这样直接对切出来的列表求和。
JS、TS 用 a.filter((x, i) => i % 2 === 0).reduce((s, x) => s + x, 0),C# 用 a.Where((x, i) => i % 2 == 0).Sum(),Java 用 IntStream.range(0, n).filter(i -> i % 2 == 0).map(i -> a[i]).sum() 先挑出来再求和。
C 用 sum[i % 2] += x,C++ 用 i += 2 跳着走的循环,Craykon 判断 i % 2 == 0 后分别加到两个变量上。
陷阱一:JS 的 reduce 如果漏写初始值 0,遇到空数组就会停下。
例 2 中敏书一个分数也没有,所以出现 TypeError(Reduce of empty array with no initial value)。
Python 的 sum、C# 的 Sum()、Java 的 sum() 对空列表给出 0。
陷阱二:在 JS 中不用 Number 把输入转成数就相加,字符串会被拼接起来。
例 1 输出的不是 18 7 而是 03510 070。
Craykon 用 + 把数和字符串相加时也是拼接,所以整行读入时要用 转数字() 转换,或者用 控制台.读数字() 读入。
陷阱三:列表的编号从 0 开始数,所以智宇的轮次是偶数号。
如果从 1 开始数轮次并把偶数次当作智宇的,两个总和就会对调,例 1 变成 7 18。

Pythonmain.py · 4 行
n = int(input())a = list(map(int, input().split()))# a[0::2]는 0, 2, 4…번, a[1::2]는 1, 3, 5…번. 빈 목록의 sum은 0이다print(sum(a[0::2]), sum(a[1::2]))
JavaScriptmain.js · 5 行
const [n, ...a] = require("fs").readFileSync(0, "utf8").trim().split(/\s+/).map(Number);// reduce에 시작값 0을 줘야 빈 배열에서도 0이 나온다const jiu = a.filter((x, i) => i % 2 === 0).reduce((s, x) => s + x, 0);const minseo = a.filter((x, i) => i % 2 === 1).reduce((s, x) => s + x, 0);console.log(`${jiu} ${minseo}`);
TypeScriptmain.ts · 6 行
import { readFileSync } from "node:fs";const [n, ...a]: number[] = readFileSync(0, "utf8").trim().split(/\s+/).map(Number);// reduce에 시작값 0을 줘야 빈 배열에서도 0이 나온다const jiu: number = a.filter((x, i) => i % 2 === 0).reduce((s, x) => s + x, 0);const minseo: number = a.filter((x, i) => i % 2 === 1).reduce((s, x) => s + x, 0);console.log(`${jiu} ${minseo}`);
JavaMain.java · 15 行
import java.util.Scanner;import java.util.stream.IntStream; public class Main {    public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        int n = sc.nextInt();        int[] a = new int[n];        for (int i = 0; i < n; i++) a[i] = sc.nextInt();        // 번호의 흐름에서 짝수 번호만 골라 그 칸의 값을 더한다. 빈 흐름의 sum()은 0이다        int jiu = IntStream.range(0, n).filter(i -> i % 2 == 0).map(i -> a[i]).sum();        int minseo = IntStream.range(0, n).filter(i -> i % 2 == 1).map(i -> a[i]).sum();        System.out.println(jiu + " " + minseo);    }}
C#Main.cs · 15 行
using System;using System.Linq; class Program{    static void Main()    {        int n = int.Parse(Console.ReadLine());        int[] a = Array.ConvertAll(Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries), int.Parse);        // Where는 (값, 번호)를 함께 받을 수 있다. 빈 목록의 Sum()은 0이다        int jiu = a.Where((x, i) => i % 2 == 0).Sum();        int minseo = a.Where((x, i) => i % 2 == 1).Sum();        Console.WriteLine($"{jiu} {minseo}");    }}
C++main.cpp · 14 行
#include <iostream>#include <vector> int main() {    int n;    std::cin >> n;    std::vector<int> a(n);    for (int& x : a) std::cin >> x;    int jiu = 0, minseo = 0;    // 두 칸씩 건너뛰며 더한다    for (int i = 0; i < n; i += 2) jiu += a[i];    for (int i = 1; i < n; i += 2) minseo += a[i];    std::cout << jiu << " " << minseo << "\n";}
Cmain.c · 14 行
#include <stdio.h> int main(void) {    int n;    scanf("%d", &n);    int sum[2] = {0, 0};   /* sum[0]은 지우, sum[1]은 민서 */    for (int i = 0; i < n; i++) {        int x;        scanf("%d", &x);        sum[i % 2] += x;   /* 0번째부터 세면 짝수 번째가 지우다 */    }    printf("%d %d\n", sum[0], sum[1]);    return 0;}
Craykonmain.cray · 17 行
n = 控制台.读行().转数字();a = 控制台.读数字();지우 = 0;민서 = 0;循环 (i = 0; i < n; i++){    // 0번부터 세면 짝수 번이 지우의 차례다    如果 (i % 2 == 0)    {        지우 += a[i];    }    否则    {        민서 += a[i];    }}控制台.输出(지우 + " " + 민서);