- 钓鱼
【问题描述】
在一条水平路边,有n(2 ≤ n ≤ 25)个钓鱼池,从左到右编号为1、2、3、……、n。小明有H(1 ≤ H ≤ 16)个小时的空余时间,他希望用这些时间钓到尽量多的鱼。他从池塘1出发向池塘n走,有选择地在一些池塘边停留一定的时间钓鱼,最后在某一个池边结束钓鱼。小明测出从第i个池塘到第i+1个池塘需要走5Ti分钟的路。还测出在第i个池边停留,第一个5分钟可以钓到鱼量Fi,以后再每钓5分钟鱼,鱼量减少Di。假设没有其他人钓鱼,也没有其它因素影响小明钓到期望数量的鱼,请编程求出能钓最多鱼的方案。
【基本要求】
很显然,在分析本题数据前你需要首先构造出数据,这里我们给出一个示例:
|
池塘编号 |
从上一池塘到本池塘的行程时间T |
首个5分钟可以钓到的鱼量F |
每隔五分钟减少的鱼量D |
|
1 |
2 |
14 |
4 |
|
2 |
1 |
3 |
1 |
|
3 |
3 |
20 |
6 |
|
4 |
1 |
11 |
2 |
|
5 |
4 |
9 |
2 |
|
6 |
2 |
23 |
11 |
|
…… |
…… |
…… |
…… |
例如,小明从起点出发到1号池塘,路途需要花费5T1=10分钟,在此停留15分钟,第一个5分钟可以钓到14条鱼,第二个5分钟可以钓到14-4=10条鱼,第三个5分钟可以钓到10-4=6条鱼。于是小明在第一个池塘总计钓到30条鱼,花费25分钟。然后他可能认为第二个池塘不值得停留,于是越过第二个池塘,直接走向第三个池塘,路途花费5T2+5T3=5*1+5*3=20分钟,然后在第三个池塘停留10分钟,钓到20+(20-6)=34条鱼。……
究竟在应该每个池塘停留多久?这正是需要你通过算法进行计算的。上述表格的具体数值可以通过随机函数生成,但你得注意不要让F和D的差值太过离谱。
另外,由于输出内容较多,一屏往往显示不完,所以输出结果必须保存到文本文件中以便单独查看。
【输入输出】
总过有多少个池塘,以及小明总共有多少时间,可以在程序运行时从键盘输入。上述表格数据应提供两种方式输入:1)通过随机函数生成,且可以二进制形式保存到用于输入的文件中;2)通过输入文件读入。
经过计算以后的输出格式(示例)为:
小明拥有的时间:10小时,合计600分钟
池塘总数:18
各池塘参数:
池塘编号 行程时间 首次鱼量 递减鱼量
1 2 14 4
2 1 3 1
……
具体过程:
抵达1号池塘:花费时间10分钟,停留时间15分钟,获得鱼量14+(14-4)+(14-2*4)=30
抵达2号池塘:花费时间5分钟,停留时间0分钟,获得鱼量0
抵达3号池塘:花费时间15分钟,停留时间10分钟,获得鱼量20+(20-6)=34
……
最终统计结果,小明路途花费合计xxx分钟,在各池塘停留合计yyy分钟,总计耗时zzz分钟,获得鱼量合计www条。
【实现提示】
从题目可以看出,小明每做一件事情所花费的时间都是5分钟为一个基本单位,因此可以直接用5分钟作为一个基本计时单位来简化处理方式。尽管各个池塘的可钓鱼量并不均等,但我们可以假定这些池塘是按照鱼量从大到小排列的(想想看为什么?),然后枚举这些池塘每一个可操作时段的理论收获值,并通过贪心算法来计算最大可钓鱼量。亦即可以每次选一个鱼最多的池塘钓一次鱼,对于每个池塘来说,由于在任何时候鱼的数目只和小明在该池塘钓鱼的时长有关,而和钓鱼的总时长无关,所以这个策略一定是最优的。问题只在于,每个池塘是否应该一直钓到无鱼可钓为止?这就是需要你动脑筋去思考的问题了。如果这个问题你能找到一条清晰的思路来解决,将对你的编程思维模式起到极好的锻炼作用。
输入文件:

输出文件

源码:
百度链接
https://pan.baidu.com/s/1ZqQ0XxOQ_mFaXWempYpB3w?pwd=rwfl
提取码:rwfl
821

被折叠的 条评论
为什么被折叠?



