F. Debate

版权声明:莉莉莉 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;
}

猜你喜欢

转载自blog.csdn.net/qq_41700151/article/details/83276961