51nod贪心算法入门-----任务分配问题

任务执行顺序

有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\n",sum);
    }
}

 

posted @ 2016-03-21 19:59  OMG_By  阅读(1345)  评论(0编辑  收藏  举报