51Nod1099 任务执行顺序(贪心)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_42391248/article/details/85220886

刚开始是以为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;
}

猜你喜欢

转载自blog.csdn.net/qq_42391248/article/details/85220886