51nod 任务执行顺序 贪心

题意:有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);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值