春季赛补题 游戏

题目描述

小 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值