51Nod1099 任務執行順序(貪心)
阿新 • • 發佈:2018-12-23
剛開始是以為r最大的在前面,排序,結果只對了幾個測試案例,然後看了下面的思路,頓悟了。
假設只有兩個任務,那麼就兩種結果,先執行a,後執行b。或者先執行b,後執行a。
前者的結果是 max(a.oper,a.store+b.oper)
後者的結果是 max(b.oper,b.store+a.oper)
這個時候可以知道,結果一定是min( a.store+b.oper , b.store+a.oper )
假設a.store + b.oper < b.store + a.oper 。產生這樣結果的原因是 先執行a,後執行b的順序
所以有b.oper - b.store < a.oper - a.store。所以可知,排序的時候要將 store-oper 這個差值大的放前面,讓它先執行,這樣就能取到最小值。
原文:https://blog.csdn.net/qq_34374664/article/details/75051962
#include<iostream> #include<algorithm> #include<cstring> #include<cmath> #include<string> using namespace std; struct node{ int r,o; }a[100000]; bool cmp(node a,node b) { return a.r-a.o>b.r-b.o; } int main() { int n,i; cin>>n; for(i=0;i<n;i++) cin>>a[i].r>>a[i].o; sort(a,a+n,cmp); int ans=0,t=0; for(i=0;i<n;i++) { ans=max(ans,t+a[i].r); t+=a[i].o; } cout<<ans<<endl; return 0; }