loj #6035. 「雅禮集訓 2017 Day4」洗衣服
阿新 • • 發佈:2022-03-06
考慮分開處理,\(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; }