题目背景
MJJ驾驶着一辆特斯拉跑车,他需要开LLLkm的路程到A市,跑车上有PPP度电,卡车没开1km就需要1度电,如果在途中电路耗尽,则无法前进到达终点。
题目描述
在途中一共有NNN个充电桩,第iii个充电桩在距离起点aia_iaikm的位置,最多可以给汽车充BiB_iBi度电,假设跑车的电瓶容量无限大,请问MJJ是否能到达终点,如果可以,请输出最少需要充多少次电?否则输出-1。
输入输出格式
输入格式:
第一行三个正整数,分别代表NNN、LLL、PPP。
第二行,N个正整数,代表第i个充电桩的位置
第三行,N个正整数,代表第i个充电桩含有的最大电量。
输出格式:
如题干。
输入输出样例
输入样例#1:
4 25 10
10 14 20 21
10 5 2 4
输出样例#1:
2
说明
1<=N<=10000
1<=L,P<=1000000
1 <= A_i <= L
1 <= B_i <= 100
这一题使用到优先队列,将可以到达的位置的加油量从大到小存到队列中,若不能达到下一个点,则pop掉最大的加油量,若此时队列为空,则代表无法加油,即无法到达指定位置。
// luogu-judger-enable-o2
#include<stdio.h>
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a[10005],b[10005];
int n,l,p;
scanf("%d %d %d",&n,&l,&p);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int i=0;i<n;i++)
scanf("%d",&b[i]);
a[n]=l; //将最后的位置存入
b[n]=0;
n++;
priority_queue<int> q;
int ans=0,dist=0,full=p,t=0; //ans是加油次数,dist是此时位置,full是此时油量
for(int i=0;i<n;i++)
{
int dis=a[i]-dist; //dis是到a[i]的距离
while(full<dis) 如果不能到达
{
if(q.empty()) 去队列中查找能否加油,不能就代表无法到达之后的点
{
printf("-1");
t=1;
break;
}
full+=q.top();
q.pop();
ans++;
}
if(t==1)
break;
full-=dis; //减去耗油量
dist=a[i]; //更新位置
q.push(b[i]); //将每个加油站的油量push到队列中
}
if(t==0)
printf("%d",ans);
return 0;
}