HLG 1261 Job!Job!Job!【优先队列+贪心】

题意:  给 n 给任务,每个任务对应相应的截至时间和价值,总时间为 m ,每个任务消耗的时间为 1,问如何分配工作顺序可以得到最大价值。

分析: 对任务按截至时间从大到小排序,从时间 t 开始,找到在符合时间 t 的最大价值的任务,然后 t--.

View Code
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>
using namespace std;
struct node
{
    int ti,va;
    const bool operator <(const struct node&a)const
    {
        return va<a.va;
    }
}q[100002];
int cmp(const void*p1,const void*p2)
{
    node *c=(node*)p1;
    node *d=(node*)p2;
    if(c->ti!=d->ti)
        return d->ti-c->ti;
    return d->va-c->va;
}
int main()
{
    int res,i,n,t,top;
    //freopen("D:1.in","r",stdin);
    while(scanf("%d%d",&n,&t)!=EOF)
    {
        priority_queue<node>que;
        for(i=0;i<n;i++)
        {
            scanf("%d%d",&q[i].ti,&q[i].va);
            if(q[i].ti>t)
                q[i].ti=t;
        }
        qsort(q,n,sizeof(q[0]),cmp);
        res=0;
        for(i=0;i<n;i++)
        {
            while(q[i].ti<t&&!que.empty())
            {
                res+=que.top().va;
                que.pop();
                t--;
            }
            que.push(q[i]);
            t=q[i].ti;
        }
        while(!que.empty()&&t>0)
        {
            res+=que.top().va;
            que.pop();
            t--;
        }
        printf("%d\n",res);
    }
    return 0;
}

 

posted @ 2012-06-22 21:52  'wind  阅读(222)  评论(0)    收藏  举报