1. 程式人生 > >Codeforces Round #508 (Div. 2)C

Codeforces Round #508 (Div. 2)C

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);
    }
}