题目
思路
每头牛的危险值 = 他前面牛的w(重量值)之和 - 自身的s(强壮值)
要使每头牛的危险值最小,根据贪心思想:
自身w值越大应该放到底部(即减小上述式中的被减数)
自身s值越大应该放到底部(即增大上述式中的减数)
话不多说,直接上代码
代码
/*
AcWing 125. 耍杂技的牛-XMUOJ蒙德冒险者的游戏
--JinlongW-2024/05/26
危险值存在负的的情况;
本题要求的是所有牛中最大的危险值(使用贪心策略使得该方案的这个值最小)
*/
#include<bits/stdc++.h>
using namespace std;
const int N=50010;
typedef pair<int,int>PII;
PII cow[N];
int n;
long long sum=0;
int ans=0;
int main(){
cin>>n;
for(int i=0;i<n;i++){
int w,s;
cin>>w>>s;
cow[i].first=w+s;
cow[i].second=s;
}
sort(cow,cow+n);//按w+s从小到大排序
int ws=cow[0].first,s=cow[0].second;
ans=sum-s; //危险值,最上面的那只危险值肯定是负的
sum+=ws-s;
for(int i=1;i<n;i++){
ws=cow[i].first,s=cow[i].second;
if(sum-s>ans)ans=sum-s;
sum+=(ws-s);
}
cout<<ans<<endl;
return 0;
}