版权声明:莉莉莉 https://blog.csdn.net/qq_41700151/article/details/83276961
一个比赛时理解不透题意的题
题目链接
有两个人竞选,如果输入00代表谁都不支持,01代表支持后者,10代表支持前者,11代表都支持,每个投票的人都有自己的影响力,要求支持两个竞选者的人数必须比总人数的一半多,找最大的影响力
先把所有11全部加进去,再取01和10个数中小的那个,把10和01都加进去,再把多出来的01或者10与00放到一起,取最大影响力的与11相同的个数
代码
#include<iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <map>
#include <cstdlib>
#include <algorithm>
#define ll long long
#define INF 0x3f3f3f
const int MAX=4e5+10;
using namespace std;
int q[MAX];
int w[MAX];
int e[MAX];
int r[MAX];
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
int n;
int t,a;
int ans1=0,ans2=0,ans3=0,ans4=0;
cin>>n;
for(int i=0; i<n; i++)
{
cin>>t>>a;
if(t==0) q[++ans1]=a;
if(t==1) w[++ans2]=a;
if(t==10)e[++ans3]=a;
if(t==11)r[++ans4]=a;
}
ll sum=0;
// sort(q+1,q+ans1+1);
sort(w+1,w+ans2+1,cmp);
sort(e+1,e+ans3+1,cmp);
for(int i=1; i<=ans4; i++) sum+=r[i];
for(int i=1; i<=min(ans2,ans3); i++) sum+=w[i]+e[i];
if(ans2>ans3)
for(int i=ans3+1; i<=ans2; i++)
q[++ans1]=w[i];
else if(ans2<ans3)
for(int i=ans2+1; i<=ans3; i++)
q[++ans1]=e[i];
sort(q+1,q+ans1+1,cmp);
// for(int i=1;i<=ans1;i++)
// cout<<q[i]<<endl;
for(int i=1; i<=ans4; i++)
sum+=q[i];
printf("%lld\n",sum);
return 0;
}