汽车加油问题,一辆汽车加满油后可以行驶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;
}