洛谷T74799 老司机(优先队列)

题目背景
MJJ驾驶着一辆特斯拉跑车,他需要开LLkm的路程到A市,跑车上有PP度电,卡车没开1km就需要1度电,如果在途中电路耗尽,则无法前进到达终点。

题目描述
在途中一共有N个充电桩,第ii个充电桩在距离起点ai km的位置,最多可以给汽车充Bi 度电,假设跑车的电瓶容量无限大,请问MJJ是否能到达终点,如果可以,请输出最少需要充多少次电?否则输出-1。

输入输出格式
输入格式:
第一行三个正整数,分别代表N、L、P。

第二行,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 <= Ai<=L
1 <= B_i <= 100

标程

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,l,p;//n个充电桩,路程l千米,初始跑车上有p度电
    cin>>n>>l>>p;
    int A[10005]={0};
    int B[10005]={0};
    for(int i=0;i<n;i++)
        cin>>A[i];
    for(int i=0;i<n;i++)
        cin>>B[i];
    A[n]=l;
    B[n]=0;
    priority_queue<int>q;
    int ans=0;//答案
    int pos=0;//当前位置
    int tank=p;//当前车上的油量
    
    for(int i=0;i<=n;i++)
    {
        int d=A[i]-pos;//要前进的距离
        while(tank-d<0)
        {
            if(q.empty())
            {
                cout<<"-1"<<endl;
                return 0;
            }
            tank += q.top();
            q.pop();
            ans++;
        }
        tank -= d;
        pos=A[i];
        q.push(B[i]);
    }
    
    cout<<ans<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43250284/article/details/89076786