news 2026/4/20 9:31:53

Gone Fishing 贪心 优先队列

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Gone Fishing 贪心 优先队列

Gone Fishing

题目描述

John 要去钓鱼。他有h 小时的时间(1 ≤ h ≤ 16),并且该区域有n 个湖泊(2 ≤ n ≤ 25),这些湖泊通过一条单向道路依次连接。

为了规划行程,John 收集了以下信息:

规则说明:

你的任务是:帮助 John 规划每个湖停留的时间,使得总钓鱼数量最大。


输入格式

包含多组测试数据:

  1. 每组第一行是整数 n(湖的数量)
  2. 第二行是整数 h(可用时间,单位:小时)
  3. 第三行是 n 个整数:fi(每个湖初始鱼数)
  4. 第四行是 n 个整数:di(每个湖递减量)
  5. 第五行是 n-1 个整数:ti(湖之间的移动时间,单位为 5 分钟)

当 n = 0 时,输入结束。


输出格式

对于每组数据:

  1. 输出一行:每个湖停留的时间(单位:分钟),用逗号分隔

  2. 再输出一行:

    Number of fish expected: 最大鱼数
  3. 不同测试用例之间输出一个空行


注意(重要)

如果存在多个最优方案:

即:按字典序优先最大化前面的湖停留时间


示例输入

2 1 10 1 2 5 2 4 4 10 15 20 17 0 3 4 3 1 2 3 4 4 10 15 50 30 0 3 4 3 1 2 3 0

示例输出

45, 5 Number of fish expected: 31 240, 0, 0, 0 Number of fish expected: 480 115, 10, 50, 35 Number of fish expected: 724

题目分析

很好,你这个总结已经接近“标准题解表达”了,我帮你稍微润色 + 补一个具体例子,让它变成考试满分级别的答案。


完整思路

我们的钓鱼次数是有限的,每 5 分钟可以进行一次决策。

为了让总收益最大化,在每一次钓鱼时,都应该选择当前能获得鱼最多的湖。

由于每个湖的鱼量会随着时间递减,因此这是一个动态最优选择问题,可以使用:

优先队列(大根堆)维护当前每个湖的收益


但本题还有一个重要限制:

❗ 只能从 1 号湖往后走,不能随意选择湖

因此我们必须:


🔹 外层策略:枚举终点 k

我们枚举:

最多可以走到哪个湖(1 ~ k)

因为走到更远的湖需要时间,如果时间不够就不能到达。


🔹 内层策略:贪心分配时间

在固定的 1 ~ k 范围内:


🔹 最终策略

在所有 k 的方案中,选择:

✔ 总收益最大的方案
✔ 若相同,按题目要求字典序优先


代码:

#include<bits/stdc++.h>usingnamespacestd;intmain(){ios::sync_with_stdio(false);cin.tie(nullptr);boolfirst=true;while(true){intn;cin>>n;if(!cin||n==0)break;inth;cin>>h;vector<int>f(n),d(n),t(n);for(inti=0;i<n;i++)cin>>f[i];for(inti=0;i<n;i++)cin>>d[i];for(inti=0;i<n-1;i++)cin>>t[i];intT=h*12;// 转换成5分钟单位vector<int>best_time(n,0);intbest_fish=-1;for(intk=0;k<n;k++){inttravel=0;for(inti=0;i<k;i++)travel+=t[i];intremain=T-travel;if(remain<=0)continue;vector<int>cur_f=f;vector<int>time(n,0);// 大根堆:鱼多优先,编号小优先(关键)priority_queue<pair<int,int>>pq;for(inti=0;i<=k;i++){pq.push({cur_f[i],-i});// 用 -i 保证编号小优先}inttotal=0;for(inti=0;i<remain;i++){auto[fish,neg_id]=pq.top();pq.pop();intid=-neg_id;total+=fish;time[id]++;cur_f[id]=max(0,cur_f[id]-d[id]);pq.push({cur_f[id],-id});}// 更新最优解if(total>best_fish){best_fish=total;best_time=time;}elseif(total==best_fish){if(time>best_time){best_time=time;}}}// 输出if(!first)cout<<"\n";first=false;for(inti=0;i<n;i++){if(i)cout<<", ";cout<<best_time[i]*5;}cout<<"\n";cout<<"Number of fish expected: "<<best_fish<<"\n";}return0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/20 9:30:47

GME多模态向量模型在文档管理中的应用:快速查找论文、PPT截图

GME多模态向量模型在文档管理中的应用&#xff1a;快速查找论文、PPT截图 1. 为什么需要多模态文档检索 想象一下这样的场景&#xff1a;你在准备一个重要的学术报告&#xff0c;需要引用之前读过的一篇论文中的某个图表&#xff0c;但只记得图表的大致内容和论文的关键词。传…

作者头像 李华
网站建设 2026/4/20 9:27:03

别急着重装!Win10网络邻居一片空白的5个排查步骤(附SMB服务修复)

Win10网络邻居一片空白&#xff1f;5步深度排查指南 当你在办公室或家庭局域网中急需访问共享文件&#xff0c;却发现"网络"文件夹空空如也&#xff0c;这种挫败感堪比找不到钥匙的早晨。Win10的网络共享功能看似简单&#xff0c;实则涉及网络发现、协议兼容、服务依…

作者头像 李华
网站建设 2026/4/20 9:26:22

极域电子教室2015版网络协议初探:一次在VMware里搭建‘教师机’的完整实验记录

极域电子教室2015版网络协议深度解析&#xff1a;安全实验环境搭建与通信机制研究 在虚拟化技术日益普及的今天&#xff0c;构建隔离的实验环境已成为网络安全学习的标准实践。极域电子教室作为国内广泛使用的教学管理软件&#xff0c;其网络通信协议设计对理解局域网应用层协议…

作者头像 李华
网站建设 2026/4/20 9:24:56

Java12~Java17部分常用的新特性总结

目录 前言 Java12 1.switch表达式 2.低延迟垃圾回收器Shenandoah Java13 1.文本块升级 Java14 1.更优雅的instanceof 2.Record记录类 Java15 1.Sealed密封类 Java16 Java17 前言 上一篇文章和大家分享的是 Java9~Java11 的常用新特性&#xff0c;这篇就再和大家分…

作者头像 李华
网站建设 2026/4/20 9:23:05

【CE进阶】Lua脚本实战:从基础API到自动化辅助工具开发

1. 从零认识CE Lua脚本开发 第一次接触Cheat Engine的Lua脚本功能时&#xff0c;我和大多数逆向工程爱好者一样感到既兴奋又困惑。兴奋的是终于找到了一个能够深度定制游戏辅助的工具&#xff0c;困惑的是官方文档里那些零散的API说明让人摸不着头脑。经过几个实际项目的锤炼&a…

作者头像 李华