旅行家的预算

旅行家的预算
上机内容:C++
上机目的:
题目描述

一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的)。给定两个城市之间的距离D1D1、汽车油箱的容量CC(以升为单位)、每升汽油能行驶的距离D2D2、出发点每升汽油价格PP和沿途油站数NN(NN可以为零),油站ii离出发点的距离DiDi、每升汽油价格PiPi(i=1,2,…,Ni=1,2,…,N)。计算结果四舍五入至小数点后两位。如果无法到达目的地,则输出“No Solution”。

输入格式

第一行,D1D1,CC,D2D2,PP,NN。

接下来有NN行。

第i+1i+1行,两个数字,油站i离出发点的距离DiDi和每升汽油价格PiPi。

输出格式

所需最小费用,计算结果四舍五入至小数点后两位。如果无法到达目的地,则输出“No Solution”。
输入输出样例

输入
275.6 11.9 27.4 2.8 2
102.0 2.9
220.0 2.2
输出
26.95
说明/提示
N≤6,其余数字≤500
我的程序:

#include <iostream>
using namespace std;
int main()
{
    float D1,C,D2,P,Di,Pi;
    int N;
    cin>>D1>>C>>D2>>P>>N;
    if(N==0)//如果没有油站//
    {
        if(D1/D2<=C)//如果油箱容量的油能够走完全程
            cout<<D1/D2*P<<endl;//用两城市间的距离求出需要油量即可
        else
            cout<<"No Solution"<<endl;
    }
    else//即中途有油站
    {
        float price[N+1];
        for(int i=0;i<=N;i++)
            price[i]=P;
        float distance[N+1];
        for(int i=1;i<=N;i++)
        {
            cin>>Di>>Pi;
            price[i]=Pi;
            distance[i]=Di;
        }
        double dis=0;//当前路程
        double oil=0;//当前油量
        double pri=0;//当前花费
        int stop=0;//当前油站的下标
        while(dis<D1)//反复贪心
        {
            double min=500;
            int idx=0;
            for(int i=0;i<=N;i++)//找出未经过的最便宜油站
            {
                if(price[i]<min&&distance[i]>=dis)
                {
                    min=price[i];
                    idx=i;
                }
            }
            if(distance[idx]==dis)//如果当前恰好在最便宜的油站
            {
                if(dis+oil*D2>=D1)//如果油量足够到达终点
                    dis=D1;
                else if(dis+C*D2>=D1)//如果加满油能够到达终点
                {
                    pri+=((D1-dis)/D2-oil)*price[idx];
                    dis=D1;
                }
                else//如果加满油仍无法到达终点
                {
                    pri+=(C-oil)*price[idx];//加满油
                    oil=C;
                    oil-=(distance[idx+1]-dis)/D2;//到达下一个油站
                    dis=distance[idx+1];
                    stop=idx+1;
                }
            }
            else//如果此站不是最便宜的油站
            {
                if(distance[idx]<=oil*D2+dis)//如果当前油量能够到达最便宜的油站
                {
                    oil-=(distance[idx]-dis)/D2;//到达最便宜的油站
                    dis=distance[idx];
                    stop=idx;
                }
                else//如果不能够到达最便宜的油站
                {
                    pri+=(distance[idx]-dis)/D2*price[stop];//在此站加到刚好可以到达最便宜的油站
                    oil=0;
                    dis=distance[idx];//到达最便宜的油站
                    stop=idx;
                }
            }
        }
        printf("%.2f\n",pri);
    }
        return 0;
}

运行结果:
在这里插入图片描述
心得体会:
做完这道题,算是领略了一个新的题型,希望自己能够记住并且以后能够学会运用这种思维。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值