洛谷 P1842 [USACO05NOV]奶牛玩杂技(排序贪心)

题目链接: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 }
AC代码
原文地址:https://www.cnblogs.com/New-ljx/p/13416180.html