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;
}
posted @ 2022-03-06 17:53  FxorG  阅读(56)  评论(0编辑  收藏  举报