Well played! CodeForces - 976E

点击打开链接

显然(感觉)把所有1操作用到一个生物上在题目要求的情况下会发挥最大效应 可以考虑一下只有两个生物和两次1操作的情况

挑(h-d)值最大的b个生物取两者最大值 这样就得到了没有1操作情况下的最大效益 然后枚举每一个生物 减去之前对总效益的贡献在加上一通1操作后的贡献 取最大值

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define N 0x3f3f3f3f3f3f3f3f

struct node
{
    ll h;
    ll d;
};

node num[200010];
ll pre[50];
int n,a,b;

void init()
{
    int i;
    pre[0]=1;
    for(i=1;i<=20;i++)
    {
        pre[i]=2*pre[i-1];
    }
    return;
}

bool cmp(node n1,node n2)
{
    return (n1.h-n1.d)>(n2.h-n2.d);
}

int main()
{
    ll ans,sum,tem,minn;
    int i,p;
    init();
    scanf("%d%d%d",&n,&a,&b);
    for(i=1;i<=n;i++)
    {
        scanf("%lld%lld",&num[i].h,&num[i].d);
    }
    sort(num+1,num+n+1,cmp);
    sum=0;
    for(i=1;i<=n;i++)
    {
        if(i<=b) sum+=max(num[i].h,num[i].d);
        else sum+=num[i].d;
    }
    ans=sum;
    if(b!=0)
    {
        minn=N;
        for(i=1;i<=n;i++)
        {
            if(i<=b)
            {
                tem=sum;
                tem-=max(num[i].h,num[i].d);
                tem+=num[i].h*pre[a];
                minn=min(minn,max(num[i].h,num[i].d)-min(num[i].h,num[i].d));
            }
            else
            {
                tem=sum;
                tem-=(num[i].d+minn);
                tem+=num[i].h*pre[a];
            }
            ans=max(ans,tem);
        }
    }
    printf("%lld\n",ans);
    return 0;
}

/*
3 1 1
10 9
8 6
7 5
*/

猜你喜欢

转载自blog.csdn.net/sunyutian1998/article/details/80238295