/*这题有几个地方需要注意: 解析见挑战P75-76 思路:每次算出到达下一个加油站的距离d(将终点视为距离起点L,油量为0的加油站),从优先队列中,不断取油直到能够抵达这个距离d,并更新取油次数。如果还没到达d之前,队列却已经为空,则说明无法到达终点;到达d以后,将此加油站的油压入优先队列,油缸tank中的油减去距离d,更新下一次循环的位置pos 注意: 1.为了处理方便,需要将题目输入的,加油站到终点的距离,改为加油站到起点的距离 2.数据不保证顺序输入,所以变为起点距离以后,还要排序,使得node数组变为距起点距离依次增加的加油站数组 3.为了使得代码更好写,将终点也视作距离L,油量0的加油站,更新加油站的个数 */ #include <iostream> #include <queue> #include <algorithm> using namespace std; int L, P, N; const int MAX_N = 1e4 + 10; struct node { int a, b; }c[MAX_N]; bool cmp(const node&a1, const node&b1) { return a1.a < b1.a; } void solve() { // 为了写起来方便,把终点也认为是加油站,不过没有油罢了 c[N].a = L; c[N].b = 0; N++; //维护加油站的优先队列 priority_queue<int> que; // ans:加油次数, pos: 现在所在位置, tank:油箱中汽油的量 int ans = 0, pos = 0, tank = P; for (int i = 0; i < N; i++) { //接下去要前进的距离 int d = c[i].a - pos; //不断加油直到油量足够行驶到下一个加油站 while ( tank - d < 0 ) { if ( que.empty() ) { cout << -1 << endl; return ; } tank += que.top(); que.pop(); ans++; } tank -= d; pos = c[i].a; que.push( c[i].b ); // 压入优先队列,优先队列并非按照顺序出列,而是按照值的大小,值大的先出列 } cout << ans << endl; } int main() { cin >> N; for ( int i = 0; i < N; i++ ) cin >> c[i].a >> c[i].b; cin >> L >> P; for ( int i = 0; i < N; i++ ) c[i].a = L - c[i].a; sort(c, c + N, cmp); solve(); return 0; }