贪心算法之钓鱼问题(python实现)

解题心得:

1、所有池在一条直线上,不走回头路

2、任意池都可以作为结束位置,减掉路途中消耗的时间,问题可化简

#!/usr/bin/env python
import sys

def  getMaxpool(pool):
    maxpool = index = 0
    poolen = len(pool)
    for i in range(poolen):
        if(maxpool<pool[i]):
            maxpool = pool[i]
            index = i 
    return index
    
def stringTransform(string, n):
    list = string.split()[0:n]
    for i in range(n):
        list[i] = int(list[i])
    return list
    
if __name__ == "__main__":
    pool = []
    n = input("请输入pool数: ")
    n = int(n)
    fishtime = int(input("请输入钓鱼的小时数: "))
    if fishtime <= 0:
         sys.exit("输入错误!!时间必须大于0!!")
    else:
        times = fishtime * 60/5
        
    pool = stringTransform(input("请输入每个池第一个五分钟钓鱼数(n个整数):"), n) 
    if len(pool) < n:
        sys.exit("输入错误,输入数量小于池数!!")
        
    decreasefish = stringTransform(input("请输入湖泊再钓鱼每5分钟的鱼量减小值(n个整数):"), n)    
    if len(decreasefish)    < n:
        sys.exit("输入错误,输入数量小于池数!!")
        
    walktime = stringTransform(input("请输入相邻两个池间行走时间(n-1个整数): "), n-1)
    if len(walktime) < n-1:
        sys.exit("输入错误,输入数量小于池数减1!!")
    
    i = j = 0
    maxfish = 0
    for i in range(n):                                      ##钓鱼结束位置
        fish = 0
        fishpools = pool[0:i+1]                           ##以i为终点的pool集合
        t = times
        print(fishpools)
        for j in range(i):
            t -= walktime[j]                                ##去掉所有路途中的时间
            print("time: %d" % t)
        while t > 0:
            poolindex = getMaxpool(fishpools)         ##获取钓鱼最大的池
            print("poolindex=%d" % poolindex)
            if fishpools[poolindex] == 0:
                break 
            else:
                fish += fishpools[poolindex]                
            print(fish)
            if fishpools[poolindex] <= decreasefish[poolindex]:
                fishpools[poolindex] = 0;
            else:
                fishpools[poolindex] -= decreasefish[poolindex]     ##刷新可钓鱼数
            t -= 1
        if maxfish < fish:
            maxfish = fish
    print("最大钓鱼数为:  %d" % maxfish)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值