题目大意:两个人 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;
}