对于卡车可以到达的最远距离,我们将沿途的所有加油站都入队,只要是能够到达的加油站,只要选择加油量最大的那个即可,与加油站的位置无关。每次加完油后将沿途能够经过的新的加油站入队,如何再从中选择一个加油量最大的,不断重复直到可以到达终点。
#include <algorithm>
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;
struct node
{
int l, p;
node(int l, int p) { this->l = l, this->p = p; }
};
bool cmp(node a, node b) { return a.l > b.l; }
int main()
{
priority_queue<int> q;
vector<node> v;
int n, l, p, pos, ans = 0, idx = 0;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d%d", &l, &p);
v.push_back(node(l, p));
}
scanf("%d%d", &l, &p);
pos = l - p;
//先将加油站按离小镇的照距离降序排序
sort(v.begin(), v.end(), cmp);
while (pos > 0)
{
//更新能够到达的加油站
while (idx < v.size())
{
if (pos <= v[idx].l)
q.push(v[idx++].p);
else
break;
}
//如果没有新的加油站能够到达,说明无解
if (q.size() == 0)
break;
else
{
pos -= q.top();
q.pop();
ans++;
}
}
if (pos <= 0)
printf("%d\n", ans);
else
printf("-1\n");
return 0;
}