acwing125. 耍杂技的牛

acwing125. 耍杂技的牛

原题链接:https://www.acwing.com/problem/content/127/

思路

题目中说所有奶牛中风险值最大的尽可能的小,意思是从奶牛的叠罗汉中从上到下,最下面的奶牛风险值最大,让这个最大值最小。

贪心题:1.猜想 2.证明自己的猜想

猜想:所有的牛w[i]+s[i]从小到大排(由上至下)奶牛中最大的风险值最小

证明:

某两只奶牛不是从小到大排 w[i]+s[i] > w[i+1]+s[i+1]

			第i个位置上的奶牛			第i+1个位置上的奶牛
交换前 w[1]+w[2]+...+w[i-1]-s[i]		w[1]+w[2]+...+w[i]-s[i+1]
交换后 w[1]+w[2]+...+w[i-1]-s[i+1]	w[1]+w[2]+...+w[i+1]-s[i]

把相同的减去,再都加上s[i]+s[i+1]:

			第i个位置上的奶牛			第i+1个位置上的奶牛
交换前 			s[i+1]						w[i]+s[i]
交换后 			s[i]						w[i+1]+s[i+1]

s[i] < w[i]+s[i], s[i]+s[i+1] < w[i]+s[i]
所以max(s[i],w[i]+s[i]) 一定小于w[i]+s[i]
所以交换后的max(s[i],w[i]+s[i])一定小于max(s[i+1],w[i]+s[i])
所以交换之后都风险值一定小于交换之前的风险值

因此只要存在从大到小排的就给它逆序换过来,最大的风险值一定会变小

为啥贪心得到的答案就是最优解:

贪心得到的答案 >= 最优解
贪心得到的答案 <= 最优解

证明:

贪心得到的答案是解的一种,最优解是最小的=>所以贪心得到的答案一定大于等
于最优解

假设最优解不是从小到大排好的,所有的逆序反过来之后会使得牛的风险值变小,
贪心得到的答案都是从小到大排好的,得到的最大风险值(n个牛中最下面的牛的
风险值最大)一定最小=>贪心得到的答案一定小于等于最优解

代码

#include<iostream>
#include<algorithm>

using namespace std;

typedef pair<int,int> PII;

const int N = 50010;

int n;
PII cow[N];

int main()
{
    scanf("%d",&n);
    
    for(int i = 0; i < n;i ++)
    {
        int w,s;
        scanf("%d%d",&w,&s);
        cow[i] = {w+s,w};
    }
    
    sort(cow,cow+n);
    
    int res = -2e9,sum = 0; // res要初始化负无穷
    for(int i = 0; i < n; i ++)
    {
        int s = cow[i].first - cow[i].second ,w = cow[i].second;
        res = max(res,sum - s); // 更新最大风险值
        sum += w; 
    }
    
    printf("%d",res);

    return 0 ;
}
posted @ 2022-09-25 12:36  r涤生  阅读(19)  评论(0编辑  收藏  举报