版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}