当前位置: 首页 > news >正文

P10277 [USACO24OPEN] Bessies Interview S 题解

P10277 [USACO24OPEN] Bessie's Interview S 题解

题目传送门

我的博客

思路

首先这道题第一问非常好做。只需要按照题目描述的那样模拟即可。即用优先队列存每个奶牛的面试时间,每次取出最小的时间,加入下一只奶牛。最后输出q.top()即可。伪代码如下。

for(i : from 1 to k){push a[i] into the queue
}
for(i : from k+1 to n){t = q.top()push a[i]+t into the queue
}
the answer is q.top()

再来看第二问。问哪些农夫可能会面试她。

显然,每个农夫会面试到哪只奶牛是不确定的,但是每只奶牛接受面试的时间是唯一确定的。所以我们可以先统计每只奶牛面试的开始时间和结束时间。当第 \(i\) 只奶牛的结束时间为 \(t\) 且第 \(j\) 只奶牛的开始时间也为 \(t\) 时,它们可能就能被同一个农夫面试。

想到了什么?笔者这里第一个想到的就是建图,然后跑dfs。具体怎么建图呢?我们发现,每次如果有 \(t\) 个农夫同时空闲下来,那么这 \(t\) 个农夫均有可能继续面试接下来 \(k\) 个奶牛。因此他们都需要和这些点连一条边。样例如下。

这时候只需要把上图反向一下,从 \(n\) 开始跑,看看那些再 \(1\)\(k\) 内的点可以遍历到即可。

但是这样时间复杂度明显爆炸了。于是我们想,令状态 \(s\) 表示当前时间 \(time\) 接受采访可能会遇到的农夫有哪些。很容易发现对于奶牛 \(i\)\(time+t_i\) 的状态和 \(time\) 的状态是一样的。于是可以让 \(time+t_i\)\(time\) 连一条边。最后从 \(n\) 接受面试的时间开始遍历,统计有哪些 \(1\)\(k\) 内可以到达的点。

因为 \(1 \leq t_i \leq 10^9\),所以建图的时候很明显需要离散化。这里用map实现。

代码

const int N=3e5+10;
int n,k,cnt=0;
ll a[N],st[N],en[N];
ll ans1=0;//第一问答案
struct node{int id;ll w;bool operator < (const node &A)const {return w<A.w;}
};
priority_queue<node> q;//优先队列
struct edge{int nxt,to;
}e[N<<1];
int head[N],num_Edge=0;
void add_Edge(int from,int to){e[++num_Edge].nxt=head[from];e[num_Edge].to=to;head[from]=num_Edge;
}
map<int,int> mp;//离散化用的map
int getid(int t){//查找离散化之后的下标if(mp.find(t)==mp.end()) mp[t]=++cnt;/*map.find函数返回的是一个迭代器,若查找成功,返回该键对应元素的迭代器;若未找到,返回与map.end()相同的迭代器*/return mp[t];
}
int vis[N];//是否被遍历到
void dfs(int u){if(vis[u]) return ;vis[u]=1;for(int i=head[u];i;i=e[i].nxt){int v=e[i].to;dfs(v);}
}
signed main(){n=Read();k=Read();cnt=k;for(int i=1;i<=n;i++) a[i]=Read();for(int i=1;i<=k;i++){//1 到 k 直接进队st[i]=0ll,en[i]=a[i];q.push((node){i,-a[i]});//上面写的大根堆,查找最小值需要用小根堆,取反一下即可add_Edge(getid(en[i]),i);}for(int i=k+1;i<=n;i++){node t=q.top();q.pop();t.w=-t.w;st[i]=t.w;en[i]=t.w+a[i];q.push({i,-en[i]}); add_Edge(getid(en[i]),getid(st[i]));//建反图}ans1=q.top().w;ans1=-ans1;printf("%lld\n",ans1);dfs(getid(ans1));//从 n 的面试时间开始遍历for(int i=1;i<=k;i++) printf("%d",vis[i]);return 0; 
}
http://www.jsqmd.com/news/33461/

相关文章:

  • 基于AIGC的图表狐深度评测:自然语言生成专业级统计图表的高效的技术实现
  • AI 时代的数据库进化论 —— 从向量到混合检索
  • 深入解析:操作系统基础:了解进程、线程、协程,理解I/O模型(阻塞/非阻塞,同步/异步)。
  • vue 3.x 前端导出功能
  • 最高法-合同目的的认定
  • 2025年恒温恒湿机标杆厂家最新推荐:中焓环境,档案室恒湿机/精密恒温恒湿机/吊顶恒温恒湿机/档案室恒温恒湿机,定义环境控制精准新标准
  • 2025年恒温恒湿厂家及恒湿设备标杆之选:中焓环境,适配机房/档案室/展柜等场景
  • 酸角糕行业发展趋势解析:2025年十大品牌综合测评与选择指南
  • [题解]P6717 [CCO 2018] Boring Lectures
  • 2025年11月酸角糕行业十大厂家排行榜:探索健康零食的新趋势与优选指南
  • mysql 查看数据库大小
  • 2025年11月酸角糕厂家综合评测:健康零食新风向与选购全攻略
  • 2025年11月酸角糕十大厂家权威排行榜:天然健康零食优选指南
  • oi 卡时技巧
  • 不越狱给iOS App装Tweak/插件:LiveContainer环境介绍与Tweak编写
  • 课后作业2(异常处理)
  • Bigtop 从零开始搭建大数据集群
  • chatgpt-to-md优化并重新复习
  • 从零开始制作 MyOS(六)
  • 2025年11月介电常数测试仪推荐厂家排行:应该如何选择靠谱供应商
  • 2025年11月电阻率测试仪工厂推荐:北京冠测精电——信誉、口碑与售后的三重保障
  • SaaS版MES系统PC端后台特性清单与设计说明
  • 【2025臻选指南】酸角糕十大品牌深度解析:传承古法与现代创新的完美融合
  • 2025年水上游乐及泳池设备标杆厂家推荐:山东汇川,室内水上乐园/儿童水上乐园/大型水上乐园/室内泳池/定制化服务引领行业新标​
  • 深入解析:开源 C++ QT QML 开发(十四)进程用途
  • 各种扩展模块
  • 2025年冷冻式干燥机标杆厂家最新推荐:凌宇机械,冷冻式压缩空气干燥机/风冷高温冷冻式干燥机/水冷高温冷冻式干燥机/吸附式干燥机/以高效节能与全场景方案树立行业新标准
  • 2025全日制艺考生文化课机构推荐榜:全日制艺考生文化课,小众优质机构精准适配需求
  • 2025艺术涂料厂家推荐榜:进口艺术涂料、意大利进口艺术涂料、意大利艺术涂料厂家,装修选品不踩坑
  • 2025济南艺考文化课培训推荐榜:艺考文化课培训,艺考文化课培训机构适配不同艺考生需求