農民約翰的n
nn頭奶牛(編號為1..
n1..n
1..n
)計畫逃跑並加入馬戲團,為此它們決定練習表演雜技。
奶牛們不是非常有創意,只提出了乙個雜技表演:
疊羅漢,表演時,奶牛們站在彼此的身上,形成乙個高高的垂直堆疊。
奶牛們正在試圖找到自己在這個堆疊中應該所處的位置順序。
這n
nn頭奶牛中的每一頭都有著自己的重量w
iw_i
wi以及自己的強壯程度s
is_i
si。
一頭牛支撐不住的可能性取決於它頭上所有牛的總重量(不包括它自己)減去它的身體強壯程度的值,現在稱該數值為風險值,風險值越大,這只牛撐不住的可能性越高。
您的任務是確定奶牛的排序,使得所有奶牛的風險值中的最大值盡可能的小。
輸入格式
第一行輸入整數n
nn,表示奶牛數量。
接下來n
nn行,每行輸入兩個整數,表示牛的重量和強壯程度,第i
ii行表示第i
ii頭牛的重量w
iw_i
wi以及它的強壯程度s
is_i
si。
輸出格式
輸出乙個整數,表示最大風險值的最小可能值。
資料範圍
1 ≤n
≤50000,1
≤wi≤
10,
000,1≤
si≤1
,000
,000
,000
1≤n≤50000,\\ 1≤w_i≤10,000,\\ 1≤s_i≤1,000,000,000
1≤n≤50
000,
1≤wi
≤10
,000
,1≤s
i≤1
,000
,000
,000
輸入樣例:
3103
2533
輸出樣例:
2
思路
貪心策略:按照w
ww和s
ss的和進行排序
貪心證明: 鄰項交換
假設排序後當前從下往上第i
ii頭牛和第i+1
i+1i+
1頭牛的風險值分別為∑j=
0i−1
wj−s
i\sum\limits_^w_j-s_i
j=0∑i−
1wj
−si
,∑j=0
iwj−
si+1
\sum\limits_^w_j-s_
j=0∑i
wj−
si+1
交換這兩頭牛後的風險值分別為∑j=
0i−1
wj−s
i+
1\sum\limits_^w_j-s_
j=0∑i−
1wj
−si
+1,∑j=
0i−1
wj+w
i+1−
si
\sum\limits_^w_j+w_-s_i
j=0∑i−
1wj
+wi
+1−
si去掉重複項∑j=
0i−1
wj
\sum\limits_^w_j
j=0∑i−
1wj
後交換前和交換後的值分別為
交換前:−si
−s_i
−si
,w i−
si+1
w_i−s_
wi−si
+1交換後:−si
+1
−s_−s
i+1
,w i+
1−si
w_−s_i
wi+1−
si易知
w i−
si+1
>−s
i+
1w_i−s_>−s_
wi−si
+1>−s
i+1
w i+
1−si
>−s
iw_−s_i>−s_i
wi+1−
si>−s
i所以只需要比較wi−
si+1
w_i-s_
wi−si
+1和wi+
1−si
w_-s_i
wi+1−
si的大小即可
w i−
si+1
+1−s iw_i−s_wi −si +1+1− si即wi+ si +1+s i+ 1w_i+s_iwi +si +1+ si+1 所以和越小的風險值越小 ** using namespace std; typedef long long ll; const int inf= 0x3f3f3f3f ;typedef pairint> pli; vectora; int n; ll ans= -inf; ll sum; intmain() );}sort (a.begin() , a. end()) ;for (auto &it:a) printf ("%lld\n" , ans) ;return0; } 傳送門 題意 農民約翰的n頭奶牛 編號為1 n 計畫逃跑並加入馬戲團,為此它們決定練習表演雜技。奶牛們不是非常有創意,只提出了乙個雜技表演 疊羅漢,表演時,奶牛們站在彼此的身上,形成乙個高高的垂直堆疊。奶牛們正在試圖找到自己在這個堆疊中應該所處的位置順序。這n頭奶牛中的每一頭都有著自己的重量wi以及... 農民約翰的 n 頭奶牛 編號為 1.n 計畫逃跑並加入馬戲團,為此它們決定練習表演雜技。奶牛們不是非常有創意,只提出了乙個雜技表演 疊羅漢,表演時,奶牛們站在彼此的身上,形成乙個高高的垂直堆疊。奶牛們正在試圖找到自己在這個堆疊中應該所處的位置順序。這n頭奶牛中的每一頭都有著自己的重量wi以及自己的強... 結論 證明 第乙個不用證明,很明顯 第二個 假設wi si w i 1 s i 1 由於wi si w i 1 s i 1 wi si si 所以交換後 兩頭牛的風險的最大值一定是小於交換前兩頭牛的風險的最大值的!那麼總體的風險的最大值就不可能增加,只可能不變或減小。所以得證。所以我們就按wi si...#include
耍雜技的牛
耍雜技的牛
125 耍雜技的牛