题目描述
小 A 和小 B 又在通过游戏决一胜负了。
今天他们玩的游戏是这样的,小 A 拿出了 n 张卡片,每张卡片上都写了一个数 ai。他们每个人轮流交替取走一张卡片,直到取完,小A先取。
记小 A 取走的卡片的权值和为 A,小B取走的卡片的权值和为 B,则小 A 最终得分为 |A|-|B|。小 A 自然希望自己的得分最大,小 B 则希望其得分最小。
他们想知道在他们都采取最优策略的情况下,小 A 的最终得分是多少。输入
第一行包含一个整数 n 。
第二行包含 n 个整数,分别为 a1,a2,...,an ,表示小 A 拿出的 n 张卡片。输出
输出一行一个整数,表示小 A 的最终得分。
样例输入 Copy
【样例1】 6 6 -1 -6 -1 4 -3 【样例2】 7 1 3 2 4 2 2 2 【样例3】 6 -1 2 3 -4 5 -6样例输出 Copy
【样例1】 1 【样例2】 2 【样例3】 1提示
样例解释
小 A 拿了为 -6 的卡片,然后小 B 拿了为 -3 的卡片。
小 A 拿了为 -1 的卡片,然后小 B 拿了为 -1 的卡片。
小 A 拿了为 4 的卡片,然后小 B 拿了为 6 的卡片。
最终小 A 的得分为 |-6-1+4|-|-3-1+6|=1 分
从大的开始,你拿一张我拿一张?
这样结果会有负数再abs一下
然后就过了???什么鬼啊
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,card[100009],a=0,b=0,l1=0,t=0;
bool cmp(ll x,ll y){
return x>y;
}
int main(){
scanf("%lld",&n);
for(int i=0;i<n;++i)scanf("%lld",&card[i]);
sort(card,card+n,cmp);
while(t<n){
a+=card[t++];
b+=card[t++];
//printf("a:%d,b:%d\n",a,b);
}
printf("%lld",abs(abs(a)-abs(b)));
return 0;
}