題目:acwing125 耍雜技的牛
三、**實現
總結農民約翰的n頭奶牛(編號為1…n)計畫逃跑並加入馬戲團,為此它們決定練習表演雜技。奶牛們不是非常有創意,只提出了乙個雜技表演:
疊羅漢,表演時,奶牛們站在彼此的身上,形成乙個高高的垂直堆疊。
奶牛們正在試圖找到自己在這個堆疊中應該所處的位置順序。
這n頭奶牛中的每一頭都有著自己的重量wi以及自己的強壯程度si。
一頭牛支撐不住的可能性取決於它頭上所有牛的總重量(不包括它自己)減去它的身體強壯程度的值,現在稱該數值為風險值,風險值越大,這只牛撐不住的可能性越高。
您的任務是確定奶牛的排序,使得所有奶牛的風險值中的最大值盡可能的小。
輸入格式
第一行輸入整數n,表示奶牛數量。
接下來n行,每行輸入兩個整數,表示牛的重量和強壯程度,第i行表示第i頭牛的重量wi以及它的強壯程度si。
輸出格式
輸出乙個整數,表示最大風險值的最小可能值。
資料範圍
1≤n≤50000,
1≤wi≤10,000,
1≤si≤1,000,000,000
輸入樣例
310 3
2 53 3
輸出樣例
2按照wi+si
從小到大的順序,從上到下排列,可以得到最優的結果。證明過程如下:假設ans
是真實答案,cnt
是我們這種方法得到的答案。
使用反證法:如果不按照按照wi+si
從小到大的順序,那麼必然有相鄰的兩頭牛滿足(w[i]+s[i]) > (w[i+1]+s[i+1])
。可以將他們交換對比風險值。
風險值第i個位置上的牛
第i+1個位置上的牛
交換前w[1]+w[2]+...+w[i-1]-s[i]
w[1]+w[2]+...+w[i-1]+w[i]-s[i+1]
交換後w[1]+w[2]+...+w[i-1]-s[i+1]
w[1]+w[2]+...+w[i-1]+w[i+1]-s[i]
接下來,我們的任務就是比較這四個數的大小。可以先對這四個數做等價變換,變成好看的形式。
風險值第i個位置上的牛
第i+1個位置上的牛
交換前s[i+1]
w[i]+s[i]
交換後s[i]
w[i+1]+s[i+1]
我們知道的是,w[i]+s[i]
大於s[i]
,並且w[i]+s[i]
大於w[i+1]+s[i+1]
,也就是說這兩頭牛交換後,最大風險值必然要小於交換前的最大風險值。因此,只要存在乙個逆序,我們把這兩頭牛交換,在其餘所有牛的風險值不變的情況下,這兩頭牛的最大風險值一定會變小,那麼所有牛的最大風險值起碼不會變大!證明了只要最優解不是從小到大遞增序列,我們都可以在最大風險值不變大的條件下,交換次序,將此最優解變換為我們猜想的wi+si
遞增形式的解。
#include
#include
using
namespace std;
typedef pair<
int,
int> pii;
const
int n=
50010
;pii cow[n]
;int n;
int w[n]
,s[n]
;int
main()
;}sort
(cow,cow+n)
;// sum儲存上面所有牛的體重之和
int res =
-2e9
, sum=0;
for(
int i=
0;icout
}
Acwing 125 耍雜技的牛
農民約翰的n頭奶牛 編號為1.n 計畫逃跑並加入馬戲團,為此它們決定練習表演雜技。奶牛們不是非常有創意,只提出了乙個雜技表演 疊羅漢,表演時,奶牛們站在彼此的身上,形成乙個高高的垂直堆疊。奶牛們正在試圖找到自己在這個堆疊中應該所處的位置順序。這n頭奶牛中的每一頭都有著自己的重量wi以及自己的強壯程度...
AcWing 125 耍雜技的牛
這是一道不簡單的貪心,難度還是有的,老師的分析方法真的很不錯啊,老師講課 這個牛是垂直擺放的,首先我們對兩個量進行乙個比較 我們先假設後面的是最大值,那我們對兩頭牛,只要滿足wi si include include using namespace std typedef pair int,int ...
ACWing 125 耍雜技的牛
有n nn頭奶牛,編號1 n 1 sim n 1 n,每個奶牛有兩個屬性,自己的重量w iw i wi 和其強壯程度s is i si 它們要表演疊羅漢,乙個疊在另乙個上面,每個奶牛的風險值定義為其上方的所有奶牛的重量之和減去其自己的強壯程度。問如何安排疊羅漢次序可以使得風險值最大的那個奶牛的風險值...