任务执行顺序
有N个任务需要执行,第i个任务计算时占R[i]个空间,而后会释放一部分,最后储存计算结果需要占据O[i]个空间(O[i] < R[i])。
分析:
可以抽象成,从一个整数开始,每次减去a,再加上b (a,b都是正数),要求每次操作都不产生负数。
令a[i] = R[i], b[i] = R[i] – O[i],O[i] < R[i],有0<b[i]<a[i]。 所以尽管每次有减有加,但是加的没有减的多,总数在不断减小。所以——按照b[i]递增的顺序排序,是最“有利”的。
#include<stdio.h> #include<iostream> #include<algorithm> using namespace std; struct point{ int r,o; }p[100001]; int cmp(point x,point y){ return x.o>y.o; } int main(){ //freopen("C://Users//Administrator//Desktop//duipai2//p1099t11in.txt","r",stdin); //freopen("C://Users//Administrator//Desktop//duipai2//out1.txt","w",stdout); int i,N,sum,ans; while(~scanf("%d",&N)){ for(i=0;i<N;i++){ scanf("%d%d",&p[i].r,&p[i].o); p[i].o=p[i].r-p[i].o; } sort(p,p+N,cmp); sum=p[0].r; ans=p[0].r; for(i=0;i<N;i++){ if(ans<p[i].r){ sum=sum+p[i].r-ans; ans=p[i].r; } ans=ans-p[i].r+p[i].o; } printf("%d ",sum); } }