1. 程式人生 > 實用技巧 >Acwing 125. 耍雜技的牛(貪心)(從區域性到全域性)

Acwing 125. 耍雜技的牛(貪心)(從區域性到全域性)

地址: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; }