/*
问题描述:一辆汽车加满油后可行驶nkm。旅途中有若干加油站。设计一个有效算法,指出应在哪些加油站停靠加油,使沿途加油次数最少。
算法设计:对于给定的n和k个加油站位置,计算最少加油次数。
数据输入:n:表示汽车加满油后可行驶nkm
k:旅途中有k个加油站
k+1个整数:表示第k个加油站与第k-1个加油站之间的距离。第0个加油站表示出发地,汽车已加满油。第k+1个加油站表示目的地。
数据输出:最少加油次数和具体在哪几个加油站加油。
例如: n=7 k=7
K+1个整数:1 2 3 4 5 1 6 6
最优值:4
*/
#include <iostream>
using namespace std;
int main()
{
int n,k,dis[20],OK[20]={0},sum,s;//dis[]表示k+1个区间的距离,OK[i]==1表示需要在第i个加油站加油,sum为需要加油的加油站总数,s为中间变量,记录当前走的路程
sum=s=0;
cin>>n>>k;
for(int i=1;i<=k+1;i++)
cin>>dis[i];
for(int i=1;i<=k+1;i++)//从第一段路遍历到第k+1个路
{
if(s+dis[i]<=n)//只要当前走的+dis[i]<n就说明可以把dis[]加入到s中
s+=dis[i];
else//不然的话说明第i-1个加油站需要加油,并且s要重新初始化
{
s=0;
OK[--i]=1;//这里--i有两个作用,第一个作用是表示第i-1个加油站需要加油,第二个作用是要重新从第i-1个加油站开始出发,即要重新对第i段路程进行探测,然而如果不--的话就直接跳到下一段了,所以是--i
}
}
for(int i=1;i<=k;i++)
if(OK[i])
{
cout<<i<<" ";
sum++;
}
cout<<endl;
cout<<sum;
}
贪心:汽车加油问题
最新推荐文章于 2023-01-06 12:50:59 发布