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 ;
}
rds_blogs