题意:
给出n个洗衣机的洗衣时间,与m个烘衣机的烘衣时间,问最快多久洗+烘完L件衣服。
题解:
假如是只洗不烘,或者只烘不洗,那就很简单了,直接贪心的选当前最快的机器,用个堆维护下就好了。
关键是怎么将答案合并起来。
这里有个套路,就是一般这种题可以考虑最小+最大。
容易证明,最快洗出来的用干得最慢的干,是最优的,所以就这么合并起来就好了。
code:
#include<queue>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define LL long long
using namespace std;
struct node{
LL a,x;
node(LL _a,LL _x):a(_a),x(_x){}
};
bool operator < (node a,node b) {return a.a>b.a;}
priority_queue<node> q;
LL L,n,m,w[100010],d[100010];
LL p1[1000010],p2[1000010];
int main()
{
scanf("%lld %lld %lld",&L,&n,&m);
for(LL i=1;i<=n;i++) scanf("%lld",&w[i]);
for(LL i=1;i<=m;i++) scanf("%lld",&d[i]);
while(!q.empty()) q.pop();
for(LL i=1;i<=n;i++) q.push(node(w[i],w[i]));
for(LL i=1;i<=L;i++)
{
node t=q.top();q.pop();
p1[i]=t.a;t.a+=t.x;
q.push(t);
}
while(!q.empty()) q.pop();
for(LL i=1;i<=m;i++) q.push(node(d[i],d[i]));
LL ans=0;
for(LL i=L;i>=1;i--)
{
node t=q.top();q.pop();
p2[i]=t.a;
ans=max(ans,p1[i]+t.a);
t.a+=t.x;q.push(t);
}
printf("%lld",ans);
}