一辆汽车加满油后可行驶n公里。旅途中有若干个加油站。设计一个有效算法,指出应
在哪些加油站停靠加油,使沿途加油次数最少。对于给定的n(n <= 5000)和k(k <= 1000)个加油站位置,编程计算最少加油次数。并证明算法能产生一个最优解。
要求:
输入:第一行有2个正整数n和k,表示汽车加满油后可行驶n公里,且旅途中有k个加油站。接下来的1 行中,有k+1 个整数,表示第k个加油站与第k-1 个加油站之间的距离。第0 个加油站表示出发地,汽车已加满油。第k+1 个加油站表示目的地。
输出:输出编程计算出的最少加油次数。如果无法到达目的地,则输出”NoSolution”。
思路:根据贪心算法的选择性质为了要使加油次数最少就会选择离加满油的点远一点的加油站加油。要使加油次数最少,应在每一次汽车中剩下的油不能再行驶到下一站的时候在该站加油。每一次加满油之后与起点具有相同条件,可以看做一个全新的起点。
#include <iostream> #include <vector> using namespace std; int greedy(vector<int> x, int n) { int j, i, s, sum = 0, k = x.size(); for(j = 0; j < k; ++j) if(x[j] > n){ cout<<"No Solution"<<endl; return -1; } for(i = 0,s = 0; i < k; ++i){ s += x[i]; if(s > n) sum++, s = x[i]; } return sum; } int main(){ int n, k; cin >> n >> k; vector<int> x(k+1); for(int i = 0; i < x.size(); i++) cin >> x[i]; int z = greedy(x, n); if(z != -1) cout << z <<endl; return 0; }
输入示例: