CF381A Sereja and Dima 题解
Content
小 S 和小 D 在玩一个游戏,游戏一开始,桌面上有 \(n\) 张牌,从左往右的分值依次是 \(a_1,a_2,a_3,...,a_n\)(保证 \(a_i\) 互不相等),现在,小 S 和小 D 轮流取两边牌,每次都会取两边的牌中分数较大的一个。小 S 先取,当 \(n\) 张牌全部取完时,游戏结束,求此时小 S 和小 D 的分数。
数据范围:\(1\leqslant n\leqslant 1000,1\leqslant a_i\leqslant 1000\)。
Solution
在游戏开始后,每次取走两边中分值较大的牌,并更新目前的左边界和右边界和玩家的分数,直到左边界和右边界相等(也就是取完了)为止,就可以得到我们想要的答案了。
Code
#include <cstdio>
#include <algorithm>
using namespace std;
int n, a[1000007], sum[3];
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; ++i)
scanf("%d", &a[i]);
int l = 1, r = n, turn = 1;
while(l <= r) {
if(a[l] < a[r])
sum[turn] += a[r--];
else
sum[turn] += a[l++];
turn = -turn + 3;
/*
当turn=1时,更新后的turn=-1+3=2。
当turn=2时,更新后的turn=-2+3=1。
*/
}
return printf("%d %d", sum[1], sum[2]), 0;
}