農民約翰的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
所以和越小的風險值越小
**
#include
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以及自己的強...
125 耍雜技的牛
結論 證明 第乙個不用證明,很明顯 第二個 假設wi si w i 1 s i 1 由於wi si w i 1 s i 1 wi si si 所以交換後 兩頭牛的風險的最大值一定是小於交換前兩頭牛的風險的最大值的!那麼總體的風險的最大值就不可能增加,只可能不變或減小。所以得證。所以我們就按wi si...