CF1038C Gambling

Gambling

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

思路:显然,我们将两个序列降序排列之后,每次\(A\)\(B\)都会做最利于自己的选择,那么就意味着序列\(A\)第一个数\(A_1\)\(B\)第一个数\(B_1\)大就取\(A_1\),反之就删\(B_1\);对\(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;
}
posted @ 2021-12-14 16:26  Wraith-Fiee  阅读(31)  评论(0)    收藏  举报