耍雜技的牛
阿新 • • 發佈:2020-11-24
樣例解釋:用方塊表示牛
題目意思就是,我們要安排一個從上到下的順序,使得牛按照這個順序疊高高
然後使得所有牛的危險係數的最大值最小
每個牛的危險係數 =它上面所有牛的重量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 }