codeforces 1070 F. Debate 貪心
阿新 • • 發佈:2018-12-05
題目:
題意:
有兩個人A,B,參加票選,給出投票人的結果和投票價值,求最大的投票價值,要求最小的票選人的票數一定為人數的一半或以上。
思路:
投票為11結果的人一定會被全選上,而從投01和投10的人中選最小的人數,11和01和10中最小的加起來就是最小票選人數。
然後再在01或10中剩下的和00中取11人數的人數求出來的價值就是答案。
當然是先進行排序處理。
程式碼如下:
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> using namespace std; const int maxn=4*1e5+5; int n; int a00[maxn]; int a10[maxn]; int a01[maxn]; int a11[maxn]; int snum=0; int ans=0; int num00; int num10; int num01; int num11; int compare (int a,int b) { return a>b; } int main() { num00=num10=num01=num11=0; scanf("%d",&n); for (int i=0;i<n;i++) { int x,inf; scanf("%d%d",&x,&inf); if(x==0) { a00[num00++]=inf; } else if(x==10) { a10[num10++]=inf; } else if(x==1) { a01[num01++]=inf; } else { a11[num11++]=inf; } } for (int i=0;i<num11;i++) { ans+=a11[i]; } snum+=num11; int cho=min(num01,num10); snum+=cho; sort(a01,a01+num01,compare); sort(a10,a10+num10,compare); for (int i=0;i<cho;i++) { ans+=a01[i]+a10[i]; } if(num01<num10) { for (int i=0;i<num10-num01;i++) { a00[num00++]=a10[num01+i]; } } else if(num01>num10) { for (int i=0;i<num01-num10;i++) { a00[num00++]=a01[num10+i]; } } sort(a00,a00+num00,compare); for (int i=0;i<num00&&i<num11;i++) { ans+=a00[i]; } printf("%d\n",ans); return 0; }