题目链接:https://www.luogu.com.cn/problem/P1842
贪心证明:
假设上面所有奶牛的总重为W,当前要放a、b两头奶牛,假设Wa+Sa<Wb+Sb
(1)a在b的上面:则a:W-Sa,b:W+Wa-Sb
(2)b在a的上面:则b:W-Sb,a:W+Wb-Sa
同时减去W得-Sa,Wa-Sb,-Sb,Wb-Sa。
因为-Sa<Wb-Sa,-Sb<Wa-Sb,所以只考虑Wa-Sb与Wb-Sa的大小关系。
若Wa-Sb<Wb-Sa,选a在b上面的方案,此时Wa+Sa<Wb+Sb,即上面的W+S小。
若Wa-Sb>Wb-Sa,选b在a上面的方案,此时Wa+Sa>Wb+Sb,即上面的W+S小。
综上所述,只需要按W+S排序,小的放在上面是最优的。其中注意一个细节:第一个奶牛的挤压程度为0-S[1]。
AC代码:
1 #include<cstdio> 2 #include<iostream> 3 #include<cmath> 4 #include<algorithm> 5 using namespace std; 6 int n; 7 int ans=-2000000000,sum; 8 struct node{ 9 int w,s,d; 10 }o[100005]; 11 bool cmp(node a,node b){ 12 return a.d<b.d; 13 } 14 int main(){ 15 scanf("%d",&n); 16 for(int i=1;i<=n;i++){ 17 scanf("%d%d",&o[i].w,&o[i].s); 18 o[i].d=o[i].w+o[i].s; 19 } 20 sort(o+1,o+n+1,cmp); 21 for(int i=1;i<=n;i++){ 22 ans=max(sum-o[i].s,ans); 23 sum+=o[i].w; 24 } 25 printf("%d",ans); 26 return 0; 27 }