codeforces 1038C Gambling

题目链接:http://codeforces.com/problemset/problem/1038/C
题目大意:A和B两个玩家玩一个游戏。起初A和B都会有一个等长的数组,然后每次每个玩家能够选择在自家数组中选择一个数或者删除对方数组中的数。已经拿走或者被删除的数不能够再被选择。然后问最后两个玩家的得分之差(A-B)。
题解思路:首先我们应该清楚,每个回合(A和B各选择一次)将会有两个数不能再被选择,因为总共2n个数,所以也就是n个回合结束游戏。所以最外层一个循环,里面模拟A和B的选择即可。
至于A和B的选择,因为两个人都是采用最有策略,所以,只需要判断当前“删除对方一个最大元素”和“得到自己一个最大元素”两者对自己那个最有利。因此只需要判断当前对方最大元素和自己最大元素的大小,如果自己的大,那么选自己,否则删除对方的元素。
代码:

#include <bits/stdc++.h>
using namespace std;

#define MAXN 100005
#define LL long long
int n,a[MAXN],b[MAXN];
LL asum,bsum;
int main()
{
    scanf("%d",&n);
    for(int i=0;i<n;i++)scanf("%d",&a[i]);
    for(int i=0;i<n;i++)scanf("%d",&b[i]);
    sort(a,a+n);asum=0;int i=n-1;
    sort(b,b+n);bsum=0;int j=n-1;
    for(int k=0;k<n;k++){
       if(a[i]>=b[j])asum+=a[i],i--;
       else j--;
       if(b[j]>=a[i])bsum+=b[j],j--;
       else i--;
    }
    cout<<asum-bsum;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值