洛谷 P1842 [USACO05NOV]奶牛玩雜技(排序貪心)
阿新 • • 發佈:2020-08-01
題目連結: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){ 12AC程式碼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 }