贪心算——7-3 汽车加油问题(15 分)

155 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第28天,点击查看活动详情

题目描述:

题目来源:王晓东《算法设计与分析》

一辆汽车加满油后可行驶 n公里。旅途中有若干个加油站。设计一个有效算法,指出应
在哪些加油站停靠加油,使沿途加油次数最少。

输入格式:

第一行有 2 个正整数n和 k(k<=1000 ),表示汽车加满油后可行驶n公里,且旅途中有 k个加油站。
第二行有 k+1 个整数,表示第 k 个加油站与第k-1 个加油站之间的距离。
第 0 个加油站表示出发地,汽车已加满油。
第 k+1 个加油站表示目的地。

输出格式:

输出最少加油次数。如果无法到达目的地,则输出“No Solution!”。

输入样例:

7 7
1 2 3 4 5 1 6 6 

输出样例:

4

代码长度限制   16 KB

时间限制     400 ms

内存限制     64 MB


在讲之前我想讲讲什么是贪心算

什么是贪心?

贪心算法(greedy algorithm ,又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解

反看这题,每次加油其实就是判断是否为最优解

思路分析:

1.我用vector容器来存储两站之间的距离

2.我们要做的是记录到下一站的距离和到下下站的距离

3.如果可以到下一站但是不能到下下站,这时我们就需要加一次油

4.特殊输出:如果油加满了都到不了下一站(即距离大于油箱的容量)

代码如下:

#include<iostream>
#include<vector>
using namespace std;
int main()
{
	int n, k;
	cin >> n >> k;
	int x;
	vector<int>v;
	for (int i = 0; i <= k; i++) {
		cin >> x;
		v.push_back(x);
	}
	int now = n, cnt = 0;
	for (int i = 0; i < k; i++) {
		int k, t;
		k = now - v[i];//到下一站
		t = k - v[i + 1];//到下下站
		if (k < 0) {
			cout << "No Solution!";
			return 0;
		}
		//可以到下一站,但到不了下下站
		else if (k >= 0 && t < 0) {
			now = n;
			cnt++;
		}
		else {
			now -= v[i];
		}
	}
	cout << cnt;
	return 0;
}

PS:成功解题=理清思路+一定的技巧~