题意:
有L件衣服要洗,每一件衣服都要先洗再烘干,有n台洗衣机和m台烘干机,给出每台机器工作的时间,问洗完所有衣服最短时间是多少。
思路:
贪心,如果只考虑洗衣的过程,可以利用优先队列保存下一次的时间,这里要考虑两个过程,我们只需要分别考虑最短,再将两个组合起来就可以,贪心一下要小的配大的,代码很简单。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN = 1e6 + 10;
LL a[MAXN], b[MAXN];
struct node {
LL t; int id;
bool operator < (const node &rhs) const {
return t > rhs.t;
}
};
LL c[MAXN];
priority_queue <node> que;
int main() {
//freopen("in.txt", "r", stdin);
int T, cs = 0;
scanf("%d", &T);
while (T--) {
int L, n, m;
scanf("%d%d%d", &L, &n, &m);
while (!que.empty()) que.pop();
for (int i = 1; i <= n; i++) {
scanf("%I64d", &a[i]);
que.push((node){a[i], i});
}
for (int i = 1; i <= L; i++) {
node now = que.top(); que.pop();
c[i] = now.t;
que.push((node){now.t + a[now.id], now.id});
}
while (!que.empty()) que.pop();
for (int i = 1; i <= m; i++) {
scanf("%I64d", &b[i]);
que.push((node){b[i], i});
}
sort (c + 1, c + 1 + L);
LL ans = 0;
for (int i = L; i >= 1; i--) {
node now = que.top(); que.pop();
ans = max(ans, now.t + c[i]);
que.push((node){now.t + b[now.id], now.id});
}
printf("Case #%d: %I64d\n", ++cs, ans);
}
return 0;
}