旅行家的预算(python)

一、题目

题目描述
一个旅行家想驾驶汽车以最少的费用从一个城市 到另一个城市(假设出发时油箱是空的)。给定两个城市之间的距离D1、汽车油箱的容量C(以升为单位)、每升汽油能行驶的距离D2、出发点每升汽油价格P 和沿途油站数N(N可以为零),油站i离出发点的距离Di、每升汽油价格Pi(i=1,2,……N)。计算结果四舍五入至小数点后两位。如果无法到达目的 地,则输出“No Solution”。
输入
第一行为4个实数D1、C、D2、P与一个非负整数N;
接下来N行,每行两个实数Di、Pi。
输出
如果可以到达目的地,输出一个实数(四舍五入至小数点后两位),表示最小费用;否则输出“No Solution”(不含引号)。
样例输入

275.6 11.9 27.4 2.8 2
102.0 2.9
220.0 2.2

样例输出

26.95

样例输入

475.6 11.9 27.4 14.98 6
102.0 9.99
220.0 13.29
256.3 14.79
275.0 10.29
277.6 11.29
381.8 10.09

样例输出

192.15

二、思路和代码

**思路:**因为总路程确定,所以总油量是确定的,故要在起点到终点之间的最便宜的站点加尽可能多的油(最多到油箱容量,或者能够到终点)。所以是采用贪心的算法,具体思路可以看注释,很详细。
(给的第二个样例在最便宜的站加油不能到终点,有需要的同学可以用来调试。)

代码:

d1, c, d2, p, N = [float(x) for x in input().split()]
ls = list()
ls.append([0, p])
for i in range(int(N)):
    ls.append([float(x) for x in input().split()])

ls.append([d1, float("inf")])

# 思路:让每一段的路费最便宜,找到start-end两点间最便宜的油站,买它的油走到终点。若剩下的油不能到达该油站,则找start到该油站之间最便宜的。
# start,end是当前位置和要去的终点, leftover是剩下的油,返回这种情况下的最少花销consume
def MinConsume(start, end, leftover):
    global ls, c, p, d2
    Consume = 0
    # 能直接到终点
    if start == end:
        return Consume
    elif ls[end][0]-ls[start][0] <= leftover*d2:
        return Consume
    # 到不了下一站
    elif ls[start+1][0]-ls[start][0] > c*d2:
        return -1*float("inf")
    # 不能直接到终点
    else:
        # 寻找剩下路径第一个最便宜的站
        cheapp = float("inf")
        cheapindex = -1
        for i in range(start, end):
            if cheapp > ls[i][1]:
                cheapindex = i
                cheapp = ls[i][1]
        
        #考虑当前站到最便宜站的耗费
        # 剩下的油能到最便宜的站
        if leftover*d2 >= ls[cheapindex][0]-ls[start][0]:
            leftover -= (ls[cheapindex][0]-ls[start][0])/d2
        else:
        # 剩下的油不能到,则找这两者之间的最便宜的站再加油直到到达那个站,到达那个站后油量为0
            Consume += MinConsume(start, cheapindex, leftover)
            leftover = 0

        # 考虑最便宜站到终点的耗费
        # 在最便宜的站加油能到终点
        if c >= (ls[end][0]-ls[cheapindex][0])/d2:
            Consume += ((ls[end][0]-ls[cheapindex][0])/d2-leftover)*cheapp
        # 在该站加满油不能到终点,则到该站加满再走到下一个站,可能no solution
        else:
            Consume += (c-leftover)*ls[cheapindex][1]
            #走到最便宜的下一站剩的油
            leftover = c-(ls[cheapindex+1][0]-ls[cheapindex][0])/d2
            # 最便宜的站能到其下一站
            if leftover >=0:
                Consume += MinConsume(cheapindex+1, end, leftover)
            else:
                Consume = -1*float("inf")
        return Consume

Consume = MinConsume(0, len(ls)-1, 0)
if Consume >= 0:
    Consume = round(Consume, 2)
    print("{:.2f}".format(Consume))
else:
    print("No Solution")

总结:在遇到这种需要分类情况很多的时候,建议对每一次的划分更直接更有逻辑一些。比如总消费=到最便宜站的消费+最便宜站到终点的消费,然后对两个分量分别继续细化讨论,让思路更清晰。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python各季度管理费用预算是指在Python项目中,为了管理和控制项目的运营成本,制定的每个季度的费用预算计划。这个预算计划包括了各项费用的预估和分配,以确保项目在每个季度都能够按照预期的成本进行运营。 具体来说,Python各季度管理费用预算通常包括以下几个方面的内容: 1. 人力资源费用:包括员工薪资、社会保险费、福利费等人力资源相关的费用。 2. 办公场地费用:包括租金、物业管理费、水电费等与办公场地相关的费用。 3. 设备和软件费用:包括购买、维护和更新办公设备、服务器、软件许可等相关费用。 4. 市场推广费用:包括广告宣传、市场调研、推广活动等与市场推广相关的费用。 5. 培训和培养人才费用:包括员工培训、技能提升、团队建设等与人才培养相关的费用。 6. 其他费用:包括差旅费、会议费、办公用品等其他与项目运营相关的费用。 为了制定Python各季度管理费用预算,通常需要进行以下步骤: 1. 分析和评估项目的运营需求和目标,确定每个季度的费用预算目标。 2. 调研市场行情和行业标准,了解各项费用的合理范围和预估水平。 3. 根据项目的具体情况和需求,制定每个季度各项费用的预算计划。 4. 定期跟踪和监控实际费用的支出情况,及时调整和控制费用预算。 5. 根据实际情况和项目变化,灵活调整费用预算,确保项目的运营成本控制在合理范围内。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值