Codeforces Round #508 (Div. 2) C. Gambling

  1. 题链接
  2. 题意:这天呢,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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值