您的位置:首页 > 其它

UVA 1422 - Processor (二分+贪心+优先队列)

2014-08-08 09:01 423 查看
先对开始时间进行排序,在利用优先队列是结束时间早点先出队;

因为时间只有20000,我们可以去枚举每个单位时间,看要给分配给那个任务,

如果某个时间队列中还有结束时间大于枚举的时间,就跳出判断是在mid的右边。

#include<stdio.h>

#include<iostream>

#include<string.h>

#include<algorithm>

#include<stdlib.h>

#include<math.h>

#include<queue>

using namespace std;

int t,n;

struct node

{

    double r,d,w;

    bool operator<(const node&tt) const{

    return d>tt.d;

    }

}work[10005];

//bool cmp(node a,node b)

//{

    //return a.r<b,r;

//}

bool cmp(node a, node b) {

    return a.r<b.r;

}

void init()

{

    scanf("%d",&n);

    for(int i=0;i<n;i++)

        scanf("%lf%lf%lf",&work[i].r,&work[i].d,&work[i].w);

    sort(work,work+n,cmp);

}

int judge(int mid)

{

    priority_queue<node> q;

    int wn=0;

    for(int i=1;i<=20000;i++)

    {

        int sum=mid;

        while(work[wn].r<i&&wn!=n)//开始时间小于i&&任务没全判断完,入队

            q.push(work[wn++]);

        while(sum!=0&&!q.empty())

        {

            node save=q.top();q.pop();

            if(i>save.d)  return false;

            if(save.w>sum)//任务时间大于给的速率

            {

                save.w-=sum;

                sum=0;

                q.push(save);

            }

            else

                sum-=save.w;

        }

        if(wn==n&&q.empty()) break;

    }

    if(wn==n&&q.empty())

        return true;

    return false;

}

int solve()

{

    int l=0,r=10000000,mid;

    while(l<r)

    {

        if(r - l == 1) break;

        mid=(l+r)>>1;

        if(!judge(mid)) l=mid;

        else

            r=mid;

    }

    return r;

}

int main()

{

    scanf("%d",&t);

    while(t--)

    {

        init();

        printf("%d\n",solve());

    }

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: