C++贪心算法汽车加油

汽车加油问题,一辆汽车加满油后可以行驶n千米,现需行驶一段具有m千米的旅途,途中有n个加油站,每个加油站的位置是已知的,试问汽车应该在途中哪些加油站停靠加油,以保证顺利到达终点,并且使加油次数最少(重点是需要输入可行驶n,需要行驶m,加油站距离x[])
C++算法


#include<iostream>
#include<vector>
using namespace std;

bool greeddy(int *distance,int& count,vector<int>& path,int &n,int &m)
{
    //从终点出发,每次走到最远需要加油的位置
    for (int i = n-1; i >= 0; --i)
    {
        //如果两个加油站距离大于n则无解
        if (i!=0&&distance[i] - distance[i - 1] > n)
        {
            return false;
        }
        else if(i==0&&distance[0]>n)
        {
            return false;
        }
        //如果终点到这个加油站的距离大于等于distance[i],则说明要加油
        if (m - n >= distance[i])
        {
            //大于的时候,应该是在上一个加油站加油
            if (m - n > distance[i])
            {
                i++;
            }
            count++;
            path.push_back(i);
            //此时只用考虑能不能到达这个加油站
            m = distance[i];
            //如果距离小于一次能跑的距离,则可以直接到,不用加油
            if (m <= n)
            {
                return true;
            }
        }
    }
    return false;
}
int main()
{
    int n,m;
    cout << "输入汽车最大行驶距离和加油站数量\n";
    cin >> n;
    cout << "输入行驶目标距离:";
    cin >> m;
    int* distance = new int[n+1];
    cout << "输入加油站距离\n";
    for (int i = 0; i < n; ++i)
    {
        cin >> distance[i];
    }
    if (n >= distance[n - 1])
    {
        cout << "无需加油,直接到达" << endl;
        return 0;
    }
    //路线上添加一个终点的位置
    distance[n] = m;
    int count = 0;
    vector<int> path;
    if (greeddy(distance,count,path,n,m))
    {
        if (!path.size())
        {
            cout << "无需加油";
            return 0;
        }
        cout << "停车加油点:";
    
        for (int i = path.size()-1; i>=0; --i)
        {
            cout << distance[path[i]]<<' ';
        }
        cout << endl;
        cout << "加油总次数:" << count << endl;
    }
    else
    {
        cout << "不可达";
    }
}

提供几组参考数据
n=5 m=5, 加油站坐标1 2 3 4 5
n=5 m=25 加油站坐标 5 10 15 20 25
n=5 m=12 加油站坐标1 2 7 8 9
n=5 m=12 加油站坐标1 2 6 8 9


def oil(n,distance):
    i=1                           #起始站加油算第一次
    count=0                       #当前站与下一站的距离
    for one in distance:
        count+=one                #试着继续累加公里数,尽量跑最长距离
        if n<count:               #加满油开始持续跑,超过当前加油距离累加公里数
            print('%d公里开始处加油'%(one))#累加距离等于或超过一次跑最长距离,要加油了
            count=one             #加满油,从新开始累计跑的距离
            i+=1                  #计加油次数
    return i
n=300
dis=[150,180,120,100,280,160]    #要求距离间隔都小于n,否则汽车中途要抛锚了
#dis=[150,60,50,180,120,100,280,160]
num=oil(n,dis)
print('该车最少要加油%d次'%(num))

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n,k;   //定义汽车加满油后可行驶距离和k个加油站
    int a[1002];   //a[k]表示第k个加油站与第k-1 个加油站之间的距离
    int count=0;   //记录加油次数
    int d;   //汽车此时还能行驶的距离
    int flag=1;
    cin>>n>>k;
    for(int i=1;i<=k+1;i++)
        cin>>a[i];
    d=n;   //刚开始汽车可以行驶n公里
    for(int i=1;i<=k+1;i++)
    {
        if(d>=a[i])   //如果汽车当前还能行驶的距离大于等于该站到下一站的距离,汽车就可以到达下一个加油站
            d-=a[i];   //到达下一个加油站后,汽车还能行驶的距离d要减去刚才的两个加油站间的距离
        else
        {
            d=n;   //如果条件不成立,就先给汽车加满油,再看能否到达下一个加油站
            if(d<a[i])   //如果满油还不能到达下一个加油站,此问题就无解了
                flag=0;
            count++;   //加满油能到达,就将加油次数加一
            d-=a[i];   //并且汽车还能行驶的距离d要减去刚才的两个加油站间的距离
        }

    }
    if(!flag)
        cout<<"No Solution!"<<endl;
    else
        cout<<count<<endl;
    return 0;
}