显然(感觉)把所有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
*/