Wraith_Fiee的博客

CF1038C Gambling

2021-11-13 · 2 min read
Codeforces

Gambling

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

思路:显然,我们将两个序列降序排列之后,每次AABB都会做最利于自己的选择,那么就意味着序列AA第一个数A1A_1BB第一个数B1B_1大就取A1A_1,反之就删B1B_1;对BB来说亦然
那我们自然可以用两个大根堆维护这两个序列达到目的

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;
}
在吹不出褶皱的日子里发光
Powered by Gridea