題目描述
在我農場上有n頭牛(1<=n<=50000),我想出了乙個雜技特技:站到彼此上面,形成乙個有一定高度的垂直堆疊,我就讓這些牛來練習這個雜技,牛正在試圖弄清楚它們應該在這堆奶牛中排列的順序。每頭n頭牛具有相關的體重(1<=w_i<=10000)和強度(1<=s_i<=1000000000)。一頭牛倒下的風險等於它身上所有牛的總體重(當然不包括它自己的體重)減去它的強度(這樣一來,一頭更強壯的牛的風險就更低)。你的任務是確定牛的順序,使任何一頭牛的最大風險最小化。
輸入第1行:整數n為單行。
行2…n+1:行i+1用兩個空分整數w和s描述牛。
輸出乙個單一的整數,給出所有奶牛的最大風險,在任何優化排序,使風險最小化。
分析:這道題是很有趣的貪心題……
一開始可能我們會無從下手……因為直接看是看不出來啥的,只按照重量或者承受能力也是不行的。
我們考慮乙個新套路,選擇兩頭奶牛,把他們進行交換,看怎麼樣貢獻會比較大。
我們假設前面的奶牛總重為w,第一頭奶牛重為w1,承受能力為s1,第二頭同理為w2,s2,那麼,第一頭的壓扁程度是w-s1,第二頭的是w+w1-s2,而交換之後,第一頭的是w-s2,第二頭的是w+w2-s1.
我們發現,w+w2-s1必然比w-s1大,而w+w1-s2必然比w-s2大,所以我們只要比較w+w2-s1和w+w1-s2即可,移項之後發現,w+s更大的那只奶牛放在下面更優,所以我們按這個指標排序計算即可。`
#include"stdio.h"
#include"string.h"
typedef struct crow;
crow crows[50000];
//資料較多,需要手動快排
void swap(crow x,long long start,long long end)
long long location(crow crows,long long start,long long end)
return start;
}void qsort(crow crows[50000],long long low,long long high)
}int main()
qsort(crows,0,n-1);
sum=0;
// printf("\n");
//for(i=0;i// printf("%lld %lld \n",crows[i].weight,crows[i].strong);
risk=sum-crows[0].strong;
sum=crows[0].weight;
for(i=1;iprintf("%lld\n",risk);
}}
luoguP1842奶牛玩雜技
解決方案 1.貪心 不像是能用動歸做 2.以什麼來貪心呢 3.重量,顯然不行 4.力量也不行 5.猜測 與重量和力量都有關,再分析樣例,發現是重量 力量 6.證明 設有a和b兩頭相鄰的牛 a在下,b在上 7.若wa sa8.交換a和b位置,設b上方牛總體重為w 9.a原 w wb sa b原 w s...
P1842 奶牛玩雜技
題目鏈結 這道題目知道結論是比較好寫的,關鍵是結論是怎樣推出來的。我們先只考慮相鄰的兩個奶牛,設這兩個奶牛為 a 和 b 這兩個奶牛上面的奶牛總重量為 w 所以我們考慮 a 在上面的情況和 b 在上面的情況。a 在上面的情況 a 的壓扁指數為 w s a b 的壓扁指數為 w w a s b b 在...
題解 P1842 奶牛玩雜技
構造相鄰的兩頭牛,看能不能貪心,且看需要滿足什麼條件的時候才能貪心。設有相鄰的兩頭牛a,b,來討論一下在滿足什麼條件的的情況下a放在b上面比b放在a上面更優 設放在a,b上面的牛的總重為w i a放在b上面 a的壓扁值 w sa b的壓扁值 w wa sb ii b放在a上面 a的壓扁值 w wb ...