首页 > 代码库 > UVA 1422 - Processor (二分+贪心+优先队列)

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

先对开始时间进行排序,在利用优先队列是结束时间早点先出队;

因为时间只有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;
}