奶牛們的雜技

2021-09-04 13:22:32 字數 1329 閱讀 9508

題目描述

在我農場上有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 ...