这题略屌……
考虑如下:
对于相邻的两头牛,它们交换位置不影响其他的任何牛,只改变这两头牛的风险值. 记sum为这两头牛上面的牛的体重总和.i在j上面 Riski=sum-si Riskj=sum+wi-sj 交换位置 Riski'=sum+wj-si Riskj'=sum-sj 方案1优于方案2,则max{Riski,Riskj}<max{Riski',Riskj'} 而Riskj>Riskj' 所以Riski'>max{Riski,Riskj},且Riski'>Riskj'. 解之得 wj-si>sj wj-si>wi-sj wj-si>si 我们只需要中间的一条.记ti=si+wi 则方案1优于方案2等价于ti<tj,即ti小的在上会更优.
所有就将所有的小牛牛们按照W+s之和排序,由小到大。
然后从上往下的计算,找出最大值,记录下来。
AC Memory : 976KB Time : 94MS
代码:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; struct node { int x,y; }n[60000]; bool cmp(node a,node b) { return (a.x+a.y)<(b.x+b.y); } int sum[60000]; int main() { int N; while(scanf("%d",&N)!=EOF) { for(int i=1;i<=N;i++) scanf("%d%d",&n[i].x,&n[i].y); sort(n+1,n+N+1,cmp); sum[0]=0; int ans=-999999999; for(int i=1;i<=N;i++) { sum[i]=sum[i-1]+n[i].x; ans=max(ans,sum[i-1]-n[i].y); } printf("%d\n",ans); } return 0; }