C语言 钓鱼问题

  1. 钓鱼

【问题描述】

在一条水平路边,有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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值