题意:有N个任务需要执行,第i个任务计算时占R[i]个空间,而后会释放一部分,最后储存计算结果需要占据O[i]个空间(O[i] < R[i])。例如:执行需要5个空间,最后储存需要2个空间。给出N个任务执行和存储所需的空间,问执行所有任务最少需要多少空间。
分析:这道题我是在草稿纸上画了画试出来的,感觉是O-R大的优先,AC后看了一篇博主的博客,内容如下:
第n个任务有两个参数,一个是执行空间oper,一个是存储时间strore。根据题意可知,oper>=store。
假设只有两个任务,那么就两种结果,先执行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 这个差值大的放前面,让它先执行,这样就能取到最小值。
原文链接:http://blog.csdn.net/u010885899/article/details/49366297
下面是AC自己的AC代码,结构体封装排序。其实感觉贪心真的要靠大胆设想
code:
#include<cstdio>
#include<algorithm>
#define max(a,b) (a>b?a:b)
using namespace std;
const int MAXN=1e5+5;
struct mission{int R,O,dif;}m[MAXN];
bool cmp(mission a,mission b){
return a.dif>b.dif;
}
int main(void){
int N;scanf("%d",&N);
for(int i=0;i<N;++i){
int a,b;scanf("%d%d",&a,&b);
m[i].R=a,m[i].O=b,m[i].dif=a-b;
}
sort(m,m+N,cmp);
long long res=0,nowspace=0,sum=0;
for(int i=0;i<N;++i){
nowspace+=m[i].R;
res=max(res,nowspace);
sum+=m[i].O;
nowspace=sum;
}
printf("%lld\n",res);
}
#include<algorithm>
#define max(a,b) (a>b?a:b)
using namespace std;
const int MAXN=1e5+5;
struct mission{int R,O,dif;}m[MAXN];
bool cmp(mission a,mission b){
return a.dif>b.dif;
}
int main(void){
int N;scanf("%d",&N);
for(int i=0;i<N;++i){
int a,b;scanf("%d%d",&a,&b);
m[i].R=a,m[i].O=b,m[i].dif=a-b;
}
sort(m,m+N,cmp);
long long res=0,nowspace=0,sum=0;
for(int i=0;i<N;++i){
nowspace+=m[i].R;
res=max(res,nowspace);
sum+=m[i].O;
nowspace=sum;
}
printf("%lld\n",res);
}