老司机 (优先队列)

2019-04-14 08:33发布

题目背景
MJJ驾驶着一辆特斯拉跑车,他需要开LLkm的路程到A市,跑车上有PP度电,卡车没开1km就需要1度电,如果在途中电路耗尽,则无法前进到达终点。 题目描述
在途中一共有NN个充电桩,第ii个充电桩在距离起点a_ikm的位置,最多可以给汽车充B_i度电,假设跑车的电瓶容量无限大,请问MJJ是否能到达终点,如果可以,请输出最少需要充多少次电?否则输出-1。 输入输出格式
输入格式:
第一行三个正整数,分别代表NN、LL、PP。 第二行,N个正整数,代表第i个充电桩的位置 第三行,N个正整数,代表第i个充电桩含有的最大电量。 输出格式:
如题干 用优先队列去存储经过的充电桩,并从小到大排列,当无法到达下一个点且队列种每种电可充时,则无法到达 #include const int N=10005; using namespace std; int a[N],b[N]; int n,l,p; void f() { a[n]=l;b[n]=0;n++; // 将终点加入数组 priority_queue<int,vector<int>,less<int> > q; int s=p,t=0,ans=0; // t记录当前位置 s记录当前电量 for(int i=0;i<n;i++){ int d=a[i]-t; // 到达该充电桩的电耗; while(s-d<0){ if(q.empty()){ cout << "-1" << endl; return; } s += q.top(); q.pop(); ans++; } s -= d; t=a[i]; q.push(b[i]); } cout << ans << endl;; } int main() { cin >> n >> l >> p; for(int i=0;i<n;i++) cin >> a[i]; for(int j=0;j<n;j++) cin >> b[j]; f(); return 0; }