题目描述
你现在要洗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;
}