d,p记录当前距离与总油量,初始化就是题目给的值,然后每次从能到达的点中选择一个油量最多的点与p相加,即现在p代表去该点加油后又乘时光机回到原来位置的总油量~

结束条件为:1、没有可以到达加油站了。2、d<=p,即能到终点了。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
struct data
{
    int dis,val;
    bool operator<(const data &next)const
    {
        return val<next.val;
    }
}po[10005];
bool comp(data a,data b)
{
    return a.dis>b.dis;
}
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=0;i<n;i++)
            scanf("%d%d",&po[i].dis,&po[i].val);
        int d,p,cnt=0;
        scanf("%d%d",&d,&p);
        sort(po,po+n,comp);
        priority_queue<data> Q;
        int k=0;
        while(k<n&&d-p<=po[k].dis)
            Q.push(po[k++]);
        while(p<d&&!Q.empty())
        {
            cnt++;
            data a=Q.top();
            Q.pop();
            p+=a.val;
            while(k<n&&d-p<=po[k].dis)
                Q.push(po[k++]);
        }
        if(p<d)
            printf("-1\n");
        else
            printf("%d\n",cnt);
    }
    return 0;
}