1. 程式人生 > 實用技巧 >耍雜技的牛

耍雜技的牛

樣例解釋:用方塊表示牛

題目意思就是,我們要安排一個從上到下的順序,使得牛按照這個順序疊高高

然後使得所有牛的危險係數的最大值最小

每個牛的危險係數 =它上面所有牛的重量w之和 減去 它自己的強壯值s

證明:

首先有成立

然後需要證明,用反證法:假設最優解不是按照wi +si從小到大排序的

那麼一定存在相鄰兩頭牛,使得

然後如果我們交換這兩頭牛的話,看看會有什麼影響

首先,交換這兩頭牛的話,對除了這兩頭牛的其他牛沒有影響

在都去掉後,每個數再加上一個si和一個s(i + 1)

首先wi +si一定大於si,然後根據我們假設的條件,又有wi +si > w(i + 1) + s(i + 1)

因此si和w(i + 1) + s(i + 1)中的最大值一定小於 wi + si

也就是si和w(i + 1) + s(i + 1)中的最大值一定小於 s(i + 1)和wi + si中的最大值

所以只要有的情況出現,交換完後,這兩個數的最大值一定會變小

因為是要求牛的最大值的最小值,所以根據反證,推出矛盾,最優解不是按照wi +si從小到大排序的,答案不是最優的

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef pair<int, int> PII;
 4 const int N = 50010
; 5 PII cow[N]; 6 int main() { 7 int n; 8 cin >> n; 9 for (int i = 0; i < n; i++) { 10 int w, s; 11 cin >> w >> s; 12 cow[i] = {w + s, s}; 13 } 14 sort(cow, cow + n); 15 int res = -2e9, sum = 0; 16 //先把最小值取為-INF 17 //sum是每頭牛上面的牛重量之和
18 for (int i = 0; i < n; i++) { 19 int s = cow[i].second, w = cow[i].first - s; 20 res = max(res, sum - s); 21 sum += w; 22 } 23 cout << res << endl; 24 return 0; 25 }