8.耍杂技的牛 推公式

 

 样例解释:用方块表示牛

 题目意思就是,我们要安排一个从上到下的顺序,使得牛按照这个顺序叠高高

然后使得所有牛的危险系数的最大值最小

每个牛的危险系数 = 它上面所有牛的重量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 }
原文地址:https://www.cnblogs.com/fx1998/p/13460279.html