zoukankan      html  css  js  c++  java
  • 耍杂技的牛

     

    样例解释:用方块表示牛

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

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

    每个牛的危险系数 = 它上面所有牛的重量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 }
  • 相关阅读:
    Sum Root to Leaf Numbers 解答
    459. Repeated Substring Pattern
    71. Simplify Path
    89. Gray Code
    73. Set Matrix Zeroes
    297. Serialize and Deserialize Binary Tree
    449. Serialize and Deserialize BST
    451. Sort Characters By Frequency
    165. Compare Version Numbers
    447. Number of Boomerangs
  • 原文地址:https://www.cnblogs.com/fx1998/p/14032353.html
Copyright © 2011-2022 走看看