Codeforces Round #508 (Div. 2)C
阿新 • • 發佈:2018-12-09
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); } }