给出
l
≤
1
e
6
l\leq1e6
l≤1e6件衣服,然后给出
n
≤
1
e
5
n\leq1e5
n≤1e5台洗衣机以及
m
≤
1
e
5
m\leq1e5
m≤1e5台烘干机,每台洗衣机有一个洗衣服的时间
w
i
w_i
wi,每台烘干机有一个烘干的时间
d
i
d_i
di,然后求问最少的把所有的衣服烘干的时间。
首先,应该让每一件衣服尽早洗完。优先队列维护下每台洗衣机结束的时间,直接模拟。然后贪心把洗完时间最晚的衣服优先用更快的烘干机烘干。
贪心的正确性大约可以这么理解(但这不是严谨的):对于更晚洗好的衣服如果我选择用更慢的烘干机,至少当前衣服最终截止时间会变更长,那么我给较早洗好的衣服用更快的烘干机没有意义,因为我关心的是最晚的那个时间。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct node {
int tim;
ll ed;
node() {}
node(int tim,ll ed):tim(tim),ed(ed) {}
bool operator <(const node &rhs) const {
return ed>rhs.ed;
}
};
priority_queue<node> q1;
const int N=1e6+7;
ll wash[N];
int main() {
int T;
scanf("%d",&T);
int kase=0;
while(T--) {
while(!q1.empty()) q1.pop();
int l,n,m;
scanf("%d%d%d",&l,&n,&m);
for(int i=1;i<=n;i++) {
int tim;
scanf("%d",&tim);
q1.push({tim,tim});
}
for(int i=1;i<=l;i++) {
node cur=q1.top();
q1.pop();
wash[i]=cur.ed;
q1.push({cur.tim,cur.ed+cur.tim});
}
while(!q1.empty()) q1.pop();
for(int i=1;i<=m;i++) {
int tim;
scanf("%d",&tim);
q1.push({tim,tim});
}
ll ans=0;
for(int i=l;i>=1;i--) {
node cur=q1.top();
q1.pop();
ans=max(ans,wash[i]+cur.ed);
q1.push({cur.tim,cur.ed+cur.tim});
}
printf("Case #%d: %lld\n",++kase,ans);
}
return 0;
}