考虑分开处理,\(f[i]\) 表示第 \(i\) 件衣服洗涤完的时刻,\(g[i]\) 为烘干。
那么我们洗完去烘干我们可以看成在洗涤的时间轴上接上了烘干,即假如要洗并烘干第 \(i\) 件,一种可行的方案最终时刻是 \(f[i]+g[i]\),考虑要使得 \(\max\{f[i]+g[p[i]]\}\) 最小,其中 \(p\) 是 \(l\) 的一个排列。
发现逆序即可。
#include <bits/stdc++.h>
#define int long long
using namespace std;
#define N (int)(1e6+5)
struct node {
int x,id;
node() {
}
node(int xx,int idd) {
x=xx; id=idd;
}
bool operator < (const node &rhs) const {
return x>rhs.x;
}
};
priority_queue<node>q;
int f[N],g[N],n,m,l,w[N],d[N];
signed main() {
cin.tie(0); ios::sync_with_stdio(false);
cin>>l>>n>>m;
for(int i=1;i<=n;i++) cin>>w[i];
for(int i=1;i<=m;i++) cin>>d[i];
for(int i=1;i<=n;i++) q.push(node(w[i],i));
for(int i=1;i<=l;i++) {
auto x=q.top(); q.pop();
f[i]=x.x; q.push(node(x.x+w[x.id],x.id));
}
while(!q.empty()) q.pop();
for(int i=1;i<=m;i++) q.push(node(d[i],i));
for(int i=1;i<=l;i++) {
auto x=q.top(); q.pop();
g[i]=x.x; q.push(node(x.x+d[x.id],x.id));
}
int ans=0;
for(int i=1;i<=l;i++) ans=max(ans,f[i]+g[l-i+1]);
cout<<ans;
return 0;
}