Codeforces Round #508 (Div. 2)C

C - 贪心、模拟

题目连接:http://codeforces.com/problemset/problem/1038/C

题意:

AB两人,每人有n个数,每人每次可以选择,从自己的数中去掉一个加一个到结果,或者是从别人的数中去掉一个,两人轮流操作,每次操作,A和B都想使两人所得的结果相差值最大,问最后两人的结果差是多少

思路:

每次操作,在两人数都不为空的时候,当自己数中最大的数大于对方数中最大的数,就从自己的里去,反之从对方里去掉

若有一方为空,则在另一方操作。

这是一道很明显的贪心题,我当时是傻了吧,先是用set做,感觉set去元素好去,后来发现会有重复元素啊嘤嘤嘤,又用vector做,各种删元素,超时= =,后来想,就直接用数组做就好了,每次操作,移动指针……最后AC了,感觉自己傻傻的QwQ

代码如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cmath>
#include<map>
#include<set>
#include<string>
#include<cstring>
using namespace std;
#define ll long long
const int N=1000005;
ll a[N],b[N];
int main(){
    ll n;
    while(scanf("%lld",&n)!=EOF){
        //cout<<n<<endl;
        for(int i=0;i<n;i++){
            scanf("%lld",&a[i]);
        }
        for(int i=0;i<n;i++){
            scanf("%lld",&b[i]);
        }
        sort(a,a+n);
        sort(b,b+n);
        ll x=0,y=0;
        int p1=n-1,p2=n-1;
        for(int i=0;i<n;i++){
            if(p1<0&&p2<0)break;
            //先A选
            if(p1<0)p2--;//A是空的
            else if(p2<0||a[p1]>b[p2]){//A不空,B空或者A>B
                x+=a[p1];p1--;
            }
            else p2--;
            //B后选
            if(p2<0)p1--;//B是空的
            else if(p1<0||b[p2]>a[p1]){//B不空,A空或者B>A
                y+=b[p2];p2--;
            }
            else p1--;
        }
        printf("%lld\n",x-y);
    }
}

猜你喜欢

转载自blog.csdn.net/m0_37579232/article/details/82693735