很烦的一个题目,只在一个仆人身上加血,可惜了,比赛的时候一个多小时,没想明白,代码中总是会有多行必出错的毛病。很烦
#include <bits\stdc++.h> using namespace std; struct node { long long x,y,z; }a[200005]; bool cmp(node b,node c) { return b.z<c.z; } long long pow1(long long n,int k) { long long ans=n; for(int i=1;i<=k;i++) ans*=2; return ans; } int main() { int n,c,b; scanf("%d%d%d",&n,&c,&b); long long max1=0,sum=0; for(int i=0;i<n;i++) scanf("%I64d%I64d",&a[i].x,&a[i].y),a[i].z=a[i].x-a[i].y; sort(a,a+n,cmp); int t=n; for(int i=0;i<n;i++) if(i+b<n)sum+=a[i].y;//比赛中写成i+t else if(a[i].z<0)sum+=a[i].y; else { if(t==n)t=i; sum+=a[i].x;} if(b==0) { printf("%I64d\n",sum); return 0; } max1=sum; a[n].x=0; a[n].y=0; a[n].z=0; for(int i=0;i<n;i++) { if(i<t&&n-t==b) { max1=max(max1,sum-a[t].x+a[t].y+max(pow1(a[i].x,c),a[i].y)-a[i].y); } else { max1=max(max1,sum-max(a[i].x,a[i].y)+pow1(a[i].x,c)); } } printf("%I64d\n",max1); return 0; }