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;
}
浙公网安备 33010602011771号