HDU - 6000(Wash)

题意:

有n件衣服,有m1 个洗衣机,m2 个烘干机,给出每个洗衣机洗一件衣服的工作时间,和每个烘干机烘干一件衣服的的工作时间, 每个机器在一个时间段只能处理一件衣服,问洗完并烘干这n件衣服最短时间是多少。

题解:

使用两个优先队列记录每台机器总的工作时间,通过贪心的思想最先洗完的衣服用较慢的烘干机,后洗完的衣服用较快的烘干机。

#include<bits/stdc++.h>
#define maxn 1000100
typedef long long int ll;
using namespace std;

struct node
{
    ll x,base;
    bool operator >(const node a)const
    {
        return x>a.x;
    }
}edg[maxn];
ll a[maxn];
priority_queue<node,vector<node>,greater<node> > q1;
priority_queue<node,vector<node>,greater<node> > q2;
int main()
{
    int T,n,m1,m2;
    ll x;
    node ed;
    scanf("%d",&T);
    for(int Case=1;Case<=T;Case++)
    {
        while(!q1.empty())
            q1.pop();
        while(!q2.empty())
            q2.pop();
        scanf("%d%d%d",&n,&m1,&m2);
        for(int i=0;i<m1;i++)
        {
            scanf("%lld",&x);
            ed.x=ed.base=x;
            q1.push(ed);
        }
        for(int i=0;i<m2;i++)
        {
            scanf("%lld",&x);
            ed.x=ed.base=x;
            q2.push(ed);
        }
        ll sum=0;
        for(int i=0;i<n;i++)
        {
            ed=q1.top();
            q1.pop();
            a[i]=ed.x;//每台洗衣机工作时间
            ed.x+=ed.base;
            q1.push(ed);
        }
        for(int i=n-1;i>=0;i--)
        {
            ed=q2.top();
            q2.pop();
            sum=max(sum,a[i]+ed.x);
            ed.x+=ed.base;
            q2.push(ed);
        }
        printf("Case #%d: %lld\n",Case,sum);
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/Vici__/article/details/82918026
hdu
今日推荐