zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    [整理]弦图学习笔记
    [整理]NOI Online 2021第一场题解
    [整理]Pólya 定理入门到入土
    [游记]2021省选抱灵记
    [整理]一些好玩的/板子的动态规划题目
    [整理]网络流随记——终(有关网络流的一些杂项)
    [整理][持续更新]多项式知识点大全(超简洁!)
    [洛谷P4338][题解][ZJOI2018]历史
    [游记]WC2021游记
    Codeforces Round #703 (Div. 2) (A~E)
  • 原文地址:https://www.cnblogs.com/fx1998/p/13460279.html
Copyright © 2011-2022 走看看