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