upc 6910 洗衣服(优先队列,贪心)

题目描述

你现在要洗L件衣服。你有n台洗衣机和m台烘干机。由于你的机器非常的小,因此你每次只能洗涤(烘干)一件衣服。
第i台洗衣机洗一件衣服需要wi分钟,第i台烘干机烘干一件衣服需要di分钟。请问把所有衣服洗干净并烘干,最少需要多少时间?假设衣服在机器间转移不需要时间,并且洗完的衣服可以过一会再烘干。

输入

输入第一行有3个整数L,n和m。第二行有n个整数w1,w2,…,wn。第三行有m个整数d1,d2,…,dm。

输出

输出一行一个整数,表示所需的最少时间。

样例输入
1 1 1
1200
34

样例输出
1234

思路:
贪心使达到时间最少,
优先队列维护
越晚细的让他尽早干

代码:


#include<bits/stdc++.h>
const int N=1e6+5;
using namespace std;
typedef long long ll;
typedef pair<ll,int>pi;
priority_queue<pi,vector<pi>,greater<pi> >q1;
priority_queue<pi,vector<pi>,greater<pi> >q2;
ll l,n,m;
long long t[N],w[N],d[N];

void wash(){
   for(int i=0;i<l;i++)
    {
       ll a=q1.top().first;
       int b=q1.top().second;
        q1.pop();
        t[i]=a; //最快洗完这个衣服的时间
        //a+=w[b];
        q1.push(make_pair(a+w[b],b));
    }

}

int main()
{
    scanf("%lld%lld%lld",&l,&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&w[i]);
        q1.push(pi(w[i],i)); //装一个洗衣机,表示用了这个洗衣机,等待w[i]时间会洗完
    }
    for(int i=1;i<=m;i++)
    {
        scanf("%lld",&d[i]);
        q2.push(pi(d[i],i));
    }
    wash();
    ll dis=0;
    for(int i=l-1;i>=0;i--) //让最晚洗完的衣服,尽早的烘
    {   //pi top=q2.top();
        ll a=q2.top().first;
       int b=q2.top().second;
        q2.pop();
        t[i]+=a;
        //a+=d[b];
        q2.push(make_pair(a+d[b],b));
       if(dis<t[i])dis=t[i];
    }
    printf("%lld",dis);
    return 0;
}



猜你喜欢

转载自blog.csdn.net/eternityZZing/article/details/81507160
UPC