携手创作,共同成长!这是我参与「掘金日新计划 · 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:成功解题=理清思路+一定的技巧~