1. 程式人生 > 實用技巧 >洛谷 P1842 [USACO05NOV]奶牛玩雜技(排序貪心)

洛谷 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程式碼