- 题链接
- 题意:这天呢,A和B在玩游戏,给他们两个分别n个数分别放到他们的列表里面,他们两个呢都会选取最优的操作使自己与对手的成绩的差值最大。有两种操作,第一种:选择自己列表中的一个数,加到自己的成绩里面,同时删除自己列表中的这个数。第二种:删除对手列表中的一个数字。
交完第二题的时候我感觉我昨天可能要飞了。可是后面一直到最后,我想了一个半多小时一直到刚才我才理解第三题的题意。我恐怕使傻了。
解题思路:以第三个案例为例。
2
2 1
5 6
初始状态下两个人的成绩应该均为0。A先开始。
一开始A为了使A-B最大,肯定要删去B最大的。
其次该B选择的时候,A的成绩还是为0,为了使B-A最大。B选择5。
此时B的成绩位5,则A为了使A-B最大只能选择2。
然后该B的时候,B里面只有5,为了使B-A最大,只能赶紧把A中的1删掉。
那么这个贪心就很明显了。不多说了。
再也没有人比我更不能理解这个代码了。
AC code:
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=222e3+5;
ll n,x,ans;
pair<ll,int>a[N];
int main(){
ios::sync_with_stdio(false);cin.tie(0);
cin>>n;n*=2;
for(int i=0;i<n;i++)cin>>x,a[i]={x,i<n/2};
sort(a,a+n);
for(int i=1;i<=n;i++){
//偶数位在前n位的加起来
if(i%2&&a[n-i].second)ans+=a[n-i].first;
//奇数位在后n位的减掉
if(!(i%2)&&!(a[n-i].second))ans-=a[n-i].first;
}
cout<<ans<<endl;
}