1. 程式人生 > >51Nod1099 任務執行順序(貪心)

51Nod1099 任務執行順序(貪心)

剛開始是以為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;
}