1. 程式人生 > 其它 >loj #6035. 「雅禮集訓 2017 Day4」洗衣服

loj #6035. 「雅禮集訓 2017 Day4」洗衣服

題傳

考慮分開處理,\(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;
}