问题描述
一辆汽车加满油后可行驶n公里。旅途中有若干个加油站。设计一个有效算法,指出应在那些加油站靠车加油,使沿途加油次数最少。并证明算法能产生一个最优解。对于给定的n和k个加油站位置,计算最少加油次数。
输入描述:输入数据的第一行有2 个正整数n和k(n≤5000,k≤1000),表示汽车加满油后可行驶n公里,且旅途中有k个加油站。接下来的1 行中,有k+1 个整数,表示第k个加油站与第k-1 个加油站之间的距离。第0 个加油站表示出发地,汽车已加满油。第k+1 个加油站表示目的地。
输出描述:将计算出的最少加油次数输出。如果无法到达目的地,则输出“No Solution!”。
问题分析
本题利用贪心算法来求解。在当前地点的油量若能够到达下一加油站,则跳到下一个加油站,若不能,则在当前地点加满油,再跳到下一加油站,每一个当前地点都可以当成一个全新的出发点。油满不够或者无法到达目的地则输出“No Solution!”。
算法详细设计
- n表示汽车加满油后可行驶n公里,k表示出发地与目的地之间有k个加油站;
- 定义数组a[k+1]存储加油站之间的距离:用a[i]标记第i个加油站与第i+1个加油站之间的距离(第0 个加油站为出发地,汽车已加满油;第k+1 个加油站为目的地);
- 用m计算加油次数,用t标记在未加油的情况下汽车还能行驶t公里,采用for循环从出发地开始(即i=0)依次计算加油次数:
3.1 若a[i]>n,则输出“No Solution”;
3.2 若t<a[i],则加油一次:t=n,m++;
3.3 行驶a[i]公里后,汽车还能行驶t- a[i]公里;
3.4 i=k+1时循环结束; - m即为所求。
算法复杂度
主函数内计算复杂度为O(k),所以该算法的时间复杂度为O(n)。
程序实现
#include <iostream>
#include <stdlib.h>
using