1. 程式人生 > >6000(Wash)

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;
}