CF1038C Gambling

CF传送门

题目大意:两个人 A , B A,B A,B玩游戏,每个人有1个长度为 n n n的序列,每次一个人可以从序列中拿一个数并加入自己的分数,或者把对手序列中没选的数中去掉一个,这两个人都足够聪明,求 A A A分数与 B B B分数的差

思路:一道简单的贪心
显然,我们将两个序列降序排列之后,每次 A A A B B B都会做最利于自己的选择,那么就意味着序列 A A A第一个数 A 1 A_1 A1 B B B第一个数 B 1 B_1 B1大就取 A 1 A_1 A1,反之就删 B 1 B_1 B1;对 B B B来说亦然
那我们自然可以用两个大根堆维护这两个序列达到目的

Code

#include <bits/stdc++.h>
using namespace std;
const int N=1e3+10,mod=1e9+7;
typedef long long ll;
int n;
priority_queue<int> a,b;
int main(){
	
	cin>>n;
	int x;
	for(int i=1;i<=n;i++){
		cin>>x;
		a.push(x);
	}
	for(int i=1;i<=n;i++){
		cin>>x;
		b.push(x);
	}
	ll ansa=0,ansb=0;
	for(int i=1;i<=n*2;i++){
		if(i%2!=0){
			if(b.empty()||(!a.empty()&&a.top()>=b.top())){
				ansa+=a.top();
				a.pop();
			}
			else if(a.empty()||a.top()<b.top()) b.pop();
		}
		else{
			if(a.empty()||(!b.empty()&&b.top()>=a.top())){
				ansb+=b.top();
				b.pop();
			}
			else if(b.empty()||b.top()<a.top()) a.pop();
		}
	}
	cout<<ansa-ansb<<endl; 
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学不会数据库

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值