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

题意:

两个人 A,B分别拥有 a[], b[] 两个序列,每个人还分别拥有 ans1,ans2 两个财富值,初始为0;

他们做游戏:每一轮A先开始,可以选择从a[] 序列选择一个值放入自己的ans1(然后这个值被去掉),或者去掉B的序列中的某个值,然后轮到B,他也这样做,然后他们每个人都想让自己的ans 减去对方的 ans尽量大;

问最后的ans1-ans2 是多少

 

思路:

考虑某个人,其最优策略就是让对方尽量小,让自己的值尽量大,这样的话轮到每个人的时候,如果对方的最大值比自己的最大值大的话,那就把对方的最大值给丢掉,否则留着肯定会比自己大;如果自己的最大值比对方大的话就把自己的最大值用掉,增加自己的ans,,

按上述最优策略模拟就好了,

 

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 7;
int a[maxn], b[maxn];
bool cmp(int a, int b) {
  return a > b;
}
int main() {
  int n;
  scanf("%d", &n);
  for(int i = 1; i <= n; ++i) {
    scanf("%d", &a[i]);
  }
  sort(a+1, a+1+n, cmp);
  for(int i = 1; i <= n; ++i) {
    scanf("%d", &b[i]);
  }
  sort(b+1, b+1+n, cmp);
  int id1 = 1, id2 = 1;
  ll ans1 = 0, ans2 = 0;
  while(id1 <= n || id2 <= n) {

    // A  first elect
    if(id1 <= n) { 
      if(id2 <= n) {
        if(a[id1] >= b[id2]) {
          ans1 += a[id1++];
        }
        else {
          id2++;
        }
      }
      else {
        ans1 += a[id1++];
      }
    }
    else { 
      id2++;
    }

    // B second elect
    if(id2 <= n) {
      if(id1 <= n) {
        if(b[id2] >= a[id1]) {
          ans2 += b[id2++];
        }
        else {
          id1++;
        }
      }
      else {
        ans2 += b[id2++];
      }
    }
    else {
      id1++;
    }

  }
  printf("%lld\n", ans1-ans2);
  return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值