Acwing 125. 耍雜技的牛(貪心)(從區域性到全域性)
阿新 • • 發佈:2020-11-13
地址:https://www.acwing.com/problem/content/description/127/
解析:
看到這種題,很容易想到,w,s的排序方法是關鍵點。
如果只排其中一個,不好想。
所以從區域性出發,考慮交換兩個相鄰奶牛:
對於 i 牛 和 i+1 牛,我們對它倆進行分析。
發現,每個值都含有:W1+....W(i-1),所以去掉就是:
題目要求:最大風險值的最小可能值
所以我們使某個奶牛的風險值降低是沒意義的,降低區域性風險最大值才有意義。
假設 Wi-S(i+1)>W(i+1)-Si
變形得:Wi+Si>W(i+1)+S(i+1)
既然Wi-S(i+1)>W(i+1)-Si而且Wi-S(i+1)>-S(i+1)
那麼不管交換前的i+1處是否是兩者最大值,交換以後,方格里的兩個值都會比之前的i+1處小,所以,區域性最大值減小了,是一個可行的方式。
根據:Wi+Si>W(i+1)+S(i+1),只要 i 羊的w+s比j羊的w+s大,那麼交換它倆,就會使區域性最大值減小。
所以排序方式按w+s從小到大即可。
最後統計一遍
#include<cstdio> #include<cstring> #include<vector> #include<set> #include<algorithm> #include<iostream> #include<vector> using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<int,int> PII; const int maxn=5e4+10,maxn2=31*maxn;//maxnᱦ struct node { int w,s; }st[maxn]; bool cmp(node a,node b) { return a.s+a.w<b.s+b.w; } int main() { int n; cin>>n;for(int i=1;i<= n;i++) { cin>>st[i].w>>st[i].s; } sort(st+1,st+1+n,cmp); ll maxx=-st[1].s; ll sum=st[1].w; for(int i=2;i<=n;i++) { maxx=max(maxx,sum-st[i].s); sum+=st[i].w; } cout<<maxx<<endl; }