题意:有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);
}
本文介绍了一种通过合理安排任务执行顺序来最小化内存空间占用的方法。通过对任务执行和存储空间需求进行排序,确保了在有限资源下高效完成所有任务。


被折叠的 条评论
为什么被折叠?



