把到终点的距离改为到起点的距离。当经过一个加油站i的时候,就认为在以后的路程中可以获得适用Bi油的权力。
而当油用完的时候,可以选择所经过的加油站中能加最大油的那个站。(这是一种情景等价,将不好想的等价为一种简单又不影响结果的情形,类同蚂蚁)
用优先队列priority_queue,如果需要加油时队列为空,则不能到达。
/*
poj 2431
*/
#include <stdio.h>
#include <queue>
#include <algorithm>
using namespace std;
int n;
int l,p;
struct v
{
int a;
int b;
} ll[10010];
bool cmp(const v &a1,const v &a2)
{
return a1.a<a2.a;
}
int solve()
{
int ans=0;
int j=0;
priority_queue<int> que;
for (int i = 1; i <=l; ++i)
{
if(i==l) return ans;
if(i==ll[j].a) {que.push(ll[j++].b);}
if(--p<=0)
{
if(que.empty()) return -1;
// printf("%d\n", que.top());
p+=que.top();
que.pop();
ans++;
}
}
return ans;
}
int main(int argc, char const *argv[])
{
scanf("%d",&n);
for (int i = 0; i < n; ++i)
scanf("%d%d",&ll[i].a,&ll[i].b);
scanf("%d%d",&l,&p);
for (int i = 0; i < n; ++i)
ll[i].a=l-ll[i].a;
sort(ll,ll+n,cmp);
printf("%d\n",solve() );
return 0;
}