【BZOJ5088】【HDU6000】 洗衣服Wash
洗衣服
题意
你现在要洗l件衣服。你有n台洗衣机和m台烘干机。由于你的机器非常的小,因此你每次只能洗涤(烘干)一件衣服。 第i台洗衣机洗一件衣服需要w_i分钟,第j台烘干机烘干一件衣服需要w_j分钟。 请问把所有衣服洗干净并烘干,最少需要多少时间?假设衣服在机器间转移不需要时间,并且洗完的衣服可以过一会再烘干。
Solution
首先我们用两个优先队列分别维护洗衣机和烘干机,每次取出顶端时间最小的,设为当前答案,然后再加上自己洗或烘干所需要的时间,丢回队列里面
这样的贪心很好理解。接下来,我们考虑怎么样才能让时间消耗最小,显然是让先洗完的用最长的烘干时间的方案嘛。
如果认为最小时间消耗的方案并不一定可以搭配上时间最长的方案,可以康康注释
code:
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define pr pair<long long,long long>
#define mp make_pair
priority_queue<pr,vector<pr>,greater<pr> >q1,q2;
bool cmp(int a,int b){
return a>b;
}
int a[100010];
int b[100010];
int ans1[1000010];
int ans2[1000010];
signed main(){
int l,n,m;
scanf("%lld%lld%lld",&l,&n,&m);
for(int i=1;i<=n;++i){
scanf("%lld",&a[i]);
q1.push(mp(a[i],i));
}
for(int i=1;i<=m;++i){
scanf("%lld",&b[i]);
q2.push(mp(b[i],i));
}
for(int i=1;i<=l;++i){
pr top=q1.top();
q1.pop();
ans1[i]=top.first;
top.first+=a[top.second];
q1.push(top);
}
for(int i=1;i<=l;++i){
pr top=q2.top();
q2.pop();
ans2[i]=top.first;
top.first+=b[top.second];
q2.push(top);
}
sort(ans1+1,ans1+1+l);
sort(ans2+1,ans2+1+l,cmp);
int ans=0;
for(int i=1;i<=l;++i)ans=max(ans,ans1[i]+ans2[i]);//这里ans1+ans2并不一定要洗完衣服立刻放入烘干机,因为对于一个烘干机,烘干顺序是无所谓的,所以这个ans2可以理解为我洗完后我选择的这个烘干机要再工作多久才能烘干完自己的所有衣服,然后取max就是答案了
printf("%lld\n",ans);
}