Codeforces 976E Well played! [贪心]

题意

给你n个物品,每个物品有两个属性h,d,有两种操作
1. 让某个物品h=h*2
2. 让某个物品d=h
两个操作的数量分别是a,b,求所有物品总的d的和最大值

题解

首先,我们可以简单得出,加倍肯定要加在同一个物品上,于是我们只要枚举加倍到哪个物品上,计算总和即可。

AC代码

#include<stdio.h>
#include<algorithm>
using namespace std;
typedef long long ll;
struct node
{
    ll h,d;
}q[200005];
bool cmp(node a,node b)
{
    return a.h-a.d>b.h-b.d;
}
int main()
{
    ll n,a,b;
    scanf("%lld%lld%lld",&n,&a,&b);
    ll sum=0;
    for(ll i=1;i<=n;i++)
        scanf("%lld%lld",&q[i].h,&q[i].d);
    sort(q+1,q+n+1,cmp);
    ll di=1;
    while(a)di*=2,a--;
    for(ll i=1;i<=b;i++)
        sum+=max(q[i].h,q[i].d);
    for(ll i=b+1;i<=n;i++)
        sum+=q[i].d;
    ll ans=sum;
    for(ll i=1;i<=b;i++)
        ans=max(ans,sum-max(q[i].h,q[i].d)+max(q[i].h*di,q[i].d));
    if(b!=0)
        for(ll i=b+1;i<=n;i++)
            ans=max(ans,sum-q[i].d+max(q[i].h*di,q[i].d)-max(q[b].h,q[b].d)+q[b].d);
    printf("%lld\n",ans);
}

猜你喜欢

转载自blog.csdn.net/acterminate/article/details/80378044