题意
给你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);
}