题目概述:
这道题是说一辆小车每单位长度露单位油,然后就这么开呀开呀想要到距离为L的另一个城镇去。路上有一些加油站,每个加油站距离目标城镇的距离给了,能加的油给了,判断最少需要的加油次数。
算法思想:
嗯大概是这样,我们该如何找到最少的加油次数呢。
答案是将加油站看成“备胎”,所以当小车每经过一个加油站,都要将这个加油站能加的油记载到某个容器里面,然后再在需要的时候把它提出来加油。
嗯好的,问题的关键来了,这个容器是什么。我们要思考,提出来加油的时候提的有什么特征,仔细贪心一下,每次提出都应该是提出加油最大的出来,这样的话才可以尽量少的加油。
当队列为空并且没有达到最后目标的话那就说明到达不了也就是错了。
代码部分:
#include <iostream> #include <algorithm> #include <queue> using namespace std; struct node { int a, b; }; node ar[10086]; bool cmp(const node &n1, const node &n2) { return n1.a < n2.a; } int main() { int n; cin >> n; priority_queue<int> q; for (int i = 0; i < n; i++) { cin >> ar[i].a >> ar[i].b; } sort(ar, ar + n, cmp); int l, p; cin >> l >> p; int cur = p, res = 0; int fuel_index = n-1; bool get = true; while (cur < l) { while (l-ar[fuel_index].a <= cur && fuel_index >= 0) { q.push(ar[fuel_index].b); fuel_index--; } if (cur >= l) { break; } if (q.empty() && cur < l) { get = false; break; } cur += q.top(); q.pop(); res++; } if (!get) cout << -1 << endl; else cout << res << endl; return 0; }