【AcWing】蓝桥杯集训每日一题Day6|多路归并|贪心|1262.鱼塘钓鱼(C++)

1262.鱼塘钓鱼

1262. 鱼塘钓鱼 - AcWing题库
难度:简单
时/空限制:1s / 64MB
总通过数:3449
总尝试数:5251
来源:《信息学奥赛一本通》
算法标签枚举贪心堆多路归并

题目内容

有N个鱼塘排成一排,每个鱼塘中有一定数量的鱼,例如:N=5时,如下表:

鱼塘编号12345
第1分钟能钓到的鱼的数量(1…1000)101420169
每钓鱼1分钟钓鱼数的减少量(1…100)24653
当前鱼塘到下一个相邻鱼塘需要的时间(单位:分钟)3544

即:在第 1 个鱼塘中钓鱼第 1 分钟内可钓到 10 条鱼,第 2 分钟内只能钓到 8 条鱼,……,第 5 分钟以后再也钓不到鱼了。
从第 1 个鱼塘到第 2 个鱼塘需要 3 分钟,从第 2 个鱼塘到第 3 个鱼塘需要 5 分钟,……
给出一个截止时间 T,设计一个钓鱼方案,从第 1 个鱼塘出发,希望能钓到最多的鱼。
假设能钓到鱼的数量仅和已钓鱼的次数有关,且每次钓鱼的时间都是整数分钟。

输入格式

共 5 行,分别表示:
第 1 行为 N;
第 2 行为第 1 分钟各个鱼塘能钓到的鱼的数量,每个数据之间用一空格隔开;
第 3 行为每过 1 分钟各个鱼塘钓鱼数的减少量,每个数据之间用一空格隔开;
第 4 行为当前鱼塘到下一个相邻鱼塘需要的时间;
第 5 行为截止时间 T。

输出格式

一个整数(不超过 2 31 − 1 2^{31}-1 2311),表示你的方案能钓到的最多的鱼。

数据范围

1≤N≤100,
1≤T≤1000

输入样例:
5
10 14 20 16 9
2 4 6 5 3
3 5 4 4
14
输出样例:
76
题目解析
鱼塘1+32+53+44+45
101420169
81014116
66863
42210
20000
00000

每个鱼塘初始最多1000条鱼
每次最少减1条鱼
每个鱼塘最多可以钓1000+999+…+1
大概是 100 0 2 2 \frac{1000^2}{2} 210002,50万条鱼
最多有100个鱼塘,所以最多钓5000万条鱼,不会爆int

非常经典的贪心问题,两步贪心

第一步贪心
考虑一下在最优解当中,都是从1号鱼塘出发,有没有可能来回反复走

比如在第一个鱼塘的位置钓了一分钟,第二个鱼塘钓了0分钟,第三个鱼塘钓了两分钟,第四个鱼塘钓了两分钟,又返回第三个鱼塘钓了一分钟,又路过第四个鱼塘没有钓,0分钟,又在第五个鱼塘钓了2分钟
如果出现了这样的情况
发现,我们可以把重复的路线去掉,直接从前往后走,在每个鱼塘钓的时间等于第一条路线的总时间,第一个鱼塘钓1,第二个钓0,第三个鱼塘直接钓三分钟,再去下一个鱼塘,先钓2再钓0,可以直接钓两分钟,最后一个鱼塘钓2
这样可以发现钓的总鱼数是一样的
因为每个鱼塘钓多少鱼取决于每个鱼塘钓多少次,至于先钓几分钟再钓几分钟是没有关系的
所以这两条路线钓的鱼的总数是一样的,但是第二条路线走的距离还少,花费的时间也更少
因此第二条路线比第一条路线更好一些

一定存在一个最优解,不会反复横跳,所以只需要考虑从前往后走直线的情况就可以了
可以反复横跳的话,路线数是指数级别,只走直线的话,路线数就只有n种情况


第二步,考虑时间

因为n很小,可以枚举到底是哪一条路线
从1走到m,(m就是从1到n去枚举)
比如当前枚举到4
表示走的路线是确定的,从1到4,但是在每个池塘上停留的时间是不确定的

总共消耗的时间,就是路上消耗的时间+钓鱼的时间
路线确定之后,路上消耗的时间就已经确定了,3+5+4=12,剩下的时间都可以用来钓鱼

接下来就把剩下的时间合理地分配到m个鱼塘上

分配的时候发现,每个鱼塘钓的鱼的总数取决于在这个鱼塘上停留的总时间,至于怎么分配都可以
比如第一分钟分配给第一个鱼塘,第二分钟分配给第二个鱼塘,第三分钟分配给第四个鱼塘,第四分钟分配给第二个鱼塘
分配的时候可以胡乱分配
一旦分配完之后,在这个路线上走的时候,在每个鱼塘上停留的时间等于分配给的总时间
确定了给每个鱼塘分配的总分钟数之后,走的时候,先在第一个鱼塘停留够1分钟,再去第二个鱼塘停留2分钟,再走到第三个鱼塘,以此类推

因此分配的时候是完全不用考虑顺序的


如果是随便分配的话,如何分配剩余的时间

假设还剩c分钟,如何分配这c分钟可以取得钓鱼数的最大值
在分配的时候,比如给第二个鱼塘分配了三分钟,一定是取前三个数,假设取的时候可以按照任意顺序取,(当然最优解一定是取前几个)
可以任意取的话,相当于是在这个大矩阵当中任意取c个数,使得总和最大
从大矩阵/集合当中取c个数,要求总和最大
非常经典的贪心模型
一定是取最大的c个

如何取出前最大的c个

可以发现每一个序列都是单调递减的
要把若干个单调序列合并成一个有序序列
就是经典的多路归并算法

多路归并思想

先找最大值,再找第二大值,以此类推

最大值怎么找,由于每个序列都是递减的,所以最大值一定是从每个序列的第一个里挑一个最大的
可以发现是20,挑完之后把20删掉
找第二大值时,从每个序列当前第一个数里挑一个最大的,是16,把16选出来,删掉
再去剩下的每个序列的最大值里挑一个最大的,挑出14
以此类推
按照这样的方式,就可以把最大的c个挑出来,这是一个多路归并算法


因为数据范围很小,所以取最大值的时候可以不用堆,直接枚举一遍就可以了

贪心与DP

将一个集合分为两类,如果每次可以证明出来某一类里一定有答案,只需要关注这一类就可以了,就是贪心
如果无法证明最优解在哪一类当中, 每一类都要求的话,就是DP

代码
#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;const int N = 110;//a表示每个鱼塘第一次钓的鱼数,d表示每一分钟减少的鱼数,l表示相差两个鱼塘之间的距离,spend表示在这个鱼塘里一共花的时间
int a[N], d[N], l[N], spend[N];//求当前鱼塘能钓多少鱼
int get (int k)
{//第一分钟能钓的鱼的数量,减去每一分钟减少的鱼数乘上经过的时间数return max(0, a[k] - d[k] * spend[k]);  //和0取一个最大值,不可能变成负数
}//如果是当前的路线的话,一共可以钓多少条鱼
int work (int n, int T)//n表示枚举到的鱼塘的最终编号,
{int res = 0; //res表示当前钓的总鱼数//初始的时候每个鱼塘都没有花时间memset (spend, 0, sizeof spend); //先把spend清空//从前往后依次枚举每次从当前n个鱼塘当中取一个最大值for (int i = 0; i < T; i ++){int t = 1;for (int j = 2; j <= n; j ++){//如果发现第t个鱼塘当前钓的鱼小于第j个鱼塘当前钓的鱼if (get(t) < get(j))t = j;  //就把t更新成j}res += get(t); //答案加上当前鱼塘能够钓的鱼的数量//这个鱼塘钓完之后,经过的时间++spend[t] ++;}return res;
}int main()
{int n, T;  scanf("%d", &n);  //先读入一下鱼塘的数量//依次读入每个鱼塘第一分钟能够钓的鱼的数量for (int i = 1; i <= n; i ++){scanf("%d", &a[i]);}//读入第二行每一分钟减少的鱼的数量for (int i = 1; i <= n; i ++){scanf("%d", &d[i]);}//读入相邻两个鱼塘之间的距离for (int i = 2; i <= n; i ++){scanf("%d", &l[i]);//为了方便,直接预处理成前缀和,表示从第一个鱼塘到当前鱼塘一共需要花多少时间l[i] += l[i - 1];}scanf("%d", &T);//定义一下答案int res = 0;//枚举一下走哪条路线for (int i = 1; i <= n; i ++)//枚举一下路线的终点,每次取一个最大值res = max(res, work(i, T - l[i]));  //T减去在路上花费的时间//最后输出钓的鱼数的最大值printf ("%d\n", res);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/755968.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

XAI之TDB:transformer-debugger的简介、安装和使用方法、应用案例之详细攻略

XAI之TDB&#xff1a;transformer-debugger的简介、安装和使用方法、应用案例之详细攻略 导读&#xff1a;小语言模型在处理一些任务时会出现无法明确解释的行为&#xff0c;难以细致追踪模型内部各个组件如神经元、注意力头等在推理过程中的作用。2024年3月12日&#xff0c;Op…

第二十六天-统计与机器学习SciPy,Scikit-Leaen

目录 1.介绍 2.使用scipy 1. 安装 2.拟合曲线 3.随机变量与概率分布 4.假设检验 5.参数检验 3.使用Scikit-Learn 1. 机器学习库&#xff0c;建立在numpy,scipy,matplotlib基础上 2.包含功能 3.安装 1.官网&#xff1a;https://scikit-learn.org 2.下载 3.线性回归…

一文掌握python函数式编程及应用实例(超详细及超多应用实例)(二)

一.命名空间和作用域: Python 的命名空间和作用域是两个密切相关的概念,它们共同决定了变量的可见性、生命周期以及如何在程序中查找变量。 a.命名空间(Namespace) 命名空间 是一个存储变量名称及其对应值的地方。在 Python 中,每个模块、函数或类都有其自己的命名空间…

STM32 ADC库函数

单片机学习&#xff01; 目录 1. RCC_ADCCLKConfig 函数 2. ADC_DeInit 函数 3. ADC_Init 函数 4. ADC_StructInit 函数 5. ADC_Cmd 函数 6. ADC_DMACmd 函数 7. ADC_ITConfig 函数 8. 用于校准的函数 8.1 ADC_ResetCalibration 函数 8.2 ADC_GetResetCalibrationSta…

【Java扫盲篇】==和equals的区别

这是一道面试经典题&#xff0c;面试官对你说&#xff1a;小伙子&#xff0c;请你说说和equals的区别 对于来说 如果比较的是基本数据类型&#xff0c;那么比较的是数据的值是否相同。注意&#xff1a;&#xff08;与数据类型无关&#xff09; int a 10;int b 10;System.out…

数据库系统概念(第二周 第二堂)(关系模型)

目录 回顾 关系模型 历史与现状 组成成分 数据结构——关系 关系定义 关系性质 关系和关系模式 难点概念理解 关系属性的分类 一、超码&#xff08;superkey&#xff09; 二、候选码&#xff08;candidate key&#xff09; 三、主码&#xff08;primary key&#…

Catmull-Rom P5 ThreeJs与前端

文章目录 问题Echarts 3D如何让曲线变得平滑&#xff1f;Echarts 2D图中平滑效果是如何实现的&#xff1f;如何在一个Echarts 3D图中画一个圆圈&#xff1f;如何在Echarts 3D图中画一个立方体&#xff1f; Catmull-Rom插值算法先来回答第二个问题回到第一个问题在Echarts 3D图中…

C#关闭程序 CefSharp.BrowserSubprocess.exe,执行控制台命令

执行控制台命令&#xff0c;关闭大量的CefSharp.BrowserSubprocess进程&#xff0c; 控制台命令&#xff1a; taskkill /f /im CefSharp.BrowserSubprocess.exe 有权限要求&#xff1a; 需要设置执行程序为管理员模式&#xff0c;IIS部署的应用程序&#xff0c;设置应用程序池…

git基础命令(三)之远程命令

目录 基础概念origin git clonegit remote add 添加远程存储库git remote 显示远程存储库列表git pushgit pushgit push origin mastergit push origin --allgit push -f origin mastegit push origin --tags git fetch获取远程仓库的更新查看远程分支的更新情况拉取特定远程分…

【Linux】——进程地址空间 Linux2.6内核进程调度队列

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 文章目录 前言 一、环境变量的补充 二、进程空间的地址 2.1、程序地址空间 2.2、研究背景 2.3、程序地址空间 来段代码感受一下 2.4、进程地址空间 2.5、如何…

一文搞懂IP

IP 1. 基本介绍2. IP地址定义3. IP地址分类4. 子网掩码5. 全局地址与私有地址 1. 基本介绍 TCP/IP 协议的心脏是网络层&#xff0c;主要“实现节点之间的通信”&#xff0c;即“点对点(end-to-end)通信”。 网络层包含IP(Internet Protocol)及DNS&#xff08;Domain Name Sys…

Linux的基本指令讲解

1 ls指令 语法&#xff1a; ls [选项][目录或文件] 功能&#xff1a; 对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#xff0c;将列出文件名以及其他信息。 常用选项&#xff1a; -a 列出目录下的所有文件&#xff0c;包括以 . 开头的隐含文件。 -d…

Leetcode 387. First Unique Character in a String

Problem Given a string s, find the first non-repeating character in it and return its index. If it does not exist, return -1. Algorithm Use two lists: one list is used to count the letters in “s”; the other list is the position where the letter first …

Json Web Token(JWT) 快速入门

推荐视频&#xff1a;【从零开始掌握JWT】 目录 第一章 会话跟踪 01 使用Cookie和Session&#xff0c;jsessionid 02 使用token 例子一&#xff1a;自定义token 例子二&#xff1a;使用redis存储token 第一章 会话跟踪 应用背景 &#xff1a;浏览器访问web应用&#xff…

下拉树级带搜索功能

可以直接复制粘贴到自己的项目里,方法处把接口替换一下 <template><div><el-popoverplacement"bottom"width"200"trigger"click"><el-inputslot"reference"class"mrInput":placeholder"placehol…

天锐绿盾 | 公司内部文件数据 \ 资料加密系统,数据防泄密软件

#防止设计图纸、各种类型文件、各种类型软件、财务数据、客户资料、源代码&#xff0c;数据存储服务器、SVN、Git等商业核心文件数据外泄# 天锐绿盾是一款专业的企业级文件数据及资料加密系统&#xff0c;旨在为企业内部数据安全提供强有力的支持。 德人合科技 | ——天锐绿盾…

生成式人工智能如何改变商业和社会

生成式人工智能是否将带来生产力黄金时代,或在全球经济中摧毁数以百万计的生计?它是否将带人们步入个人充实的新成长道路,或引导他们一步步走入孤独和隔离的死胡同?它是否将 引领人类 走向新的高处,或播下我们集体毁灭的种子? 自ChatGPT上线以来14个月来,人们还没有完全弄清…

B站python爬虫课程笔记(Q11-15)

下面是学习的网址&#xff1a; ​​​​​​【Python爬虫】 目录 11、class定义类别的一些问题 1&#xff09;定义init初始化函数的一些问题 2&#xff09;定义两个不同函数之间要有空行 3&#xff09;print的技巧 12、class定义类别的一些问题2 13、class_inheritance类…

MySQL数据库的基本概念与安装

目录 引言 一、数据库的基本概念 &#xff08;一&#xff09;数据、表与数据库 1.数据(Data) 2.表 3.数据库 &#xff08;二&#xff09;数据库管理系统 &#xff08;三&#xff09;数据库系统 二、数据库的发展 三、主流数据库的介绍 &#xff08;一&#xff09;关…

地理数据表达方式学习——KML与SHP

一、KML-Keyhole Markup Language Keyhole Markup Language (KML)是一种XML符号&#xff0c;用于浏览器中二维地图和三维地球的地理注释和地理可视化&#xff08;地理数据包括点、线、面、多边形、多面体以及模型等&#xff09;。KML是伴随着Google Earth的使用而开发的&#x…