loj #6035. 「雅礼集训 2017 Day4」洗衣服

题传

考虑分开处理,f[i] 表示第 i 件衣服洗涤完的时刻,g[i] 为烘干。

那么我们洗完去烘干我们可以看成在洗涤的时间轴上接上了烘干,即假如要洗并烘干第 i 件,一种可行的方案最终时刻是 f[i]+g[i],考虑要使得 max{f[i]+g[p[i]]} 最小,其中 pl 的一个排列。

发现逆序即可。

#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; }

__EOF__

本文作者F x o r G
本文链接https://www.cnblogs.com/xugangfan/p/15972812.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   FxorG  阅读(67)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示