题目描述
你现在要洗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
输出一行一个整数,表示所需的最少时间。
样例输入
1 1 1 1200 34
样例输出
1234
来源/分类
【总结】
我自认为这道题属于一眼看上去就很简单但是仔细想又不是特别好想的题 要求的是最小时间 基本上都能想到贪心 用优先队列处理 比较难想到的是洗完衣服之后烘干的过程 这个时候(用我BF的一句话)我们要纵观全局,看到整个时间轴。我们想让时间最短,就要让最后一件洗完的衣服尽可能早的出来,所以它必须用最快的烘干机!!!这是重点 以此类推 倒数第二件出来的衣服用第二快的烘干机 (这里的第二快不一定是时间排行第二,因为有可能第一个烘干机烘三遍比第二个烘干机烘一遍都快,每当优先队列的首元素出队列时 都得让它再加上一倍的时间继续入队列)
【代码】
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+3;
ll t[maxn];//记录每件衣服洗完的时间
ll n[maxn],m[maxn];
typedef pair<ll,ll> P;
int main()
{
priority_queue<P,vector<P>,greater<P> >q1;
priority_queue<P,vector<P>,greater<P> >q2;
ll l,nn,mm;
cin>>l>>nn>>mm;
for(int i=1;i<=nn;i++)
{
cin>>n[i];//xi
q1.push(make_pair(n[i],i));
}
for(int i=1;i<=mm;i++)
{
cin>>m[i];//hong
q2.push(make_pair(m[i],i));
}
for(int k=1;k<=l;k++)
{
P a=q1.top();
q1.pop();
t[k]=a.first;
int b=a.second;
q1.push(make_pair(t[k]+n[b],b));
}
ll ans=0;
for(int k=l;k;k--)
{
P a=q2.top();
q2.pop();
t[k]+=a.first;
int b=a.second;
q2.push(make_pair(a.first+m[b],b));
ans=max(ans,t[k]);
}
printf("%lld\n",ans);
return 0;
}