本文主要是介绍Well played! CodeForces - 976E,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
点击打开链接
显然(感觉)把所有1操作用到一个生物上在题目要求的情况下会发挥最大效应 可以考虑一下只有两个生物和两次1操作的情况
挑(h-d)值最大的b个生物取两者最大值 这样就得到了没有1操作情况下的最大效益 然后枚举每一个生物 减去之前对总效益的贡献在加上一通1操作后的贡献 取最大值
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define N 0x3f3f3f3f3f3f3f3fstruct 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
*/
这篇关于Well played! CodeForces - 976E的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!