POJ 2431 Expedition
Posted zlrrrr
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 2431 Expedition相关的知识,希望对你有一定的参考价值。
练习优先队列的第一道题
题意:
一辆卡车需要行驶 $L$ 的距离, 卡车油箱里有 $P$ 单位的油 , 每行驶一单位长度耗费一单位的油, 在沿途有 $N$ 个加油站 ,第 $i$ 个加油站在距离起点 $Ai$ 的位置,可以加 $Bi$ 单位的油,假设油箱容量无限大, 最少加多少次油可以到达终点
样例:
$N = 4, L = 25, P = 10$
$A$ = {10, 14, 20, 21}
$B $= {10, 5, 2, 4}
最少加油次数:2
题解:
使用从大到校的顺序依次取出数值的优先队列,在经过加油站的时候向优先队列里加入 $Bi$, 油箱空的时候如果优先队列也是空的那么无法到达,反之取出 $que.top$, 给油箱加油
时间复杂度:$O(N*log(N))$
代码:
#include <bits/stdc++.h> using namespace std; const int maxn = 1e5 + 10; int N, L, P; int A[maxn], B[maxn]; void solve() { A[N] = L; B[N] = 0; N ++; priority_queue<int> que; int ans = 0, pos = 0, tank = P; for(int i = 0; i < N; i ++) { int d = A[i] - pos; while(tank - d < 0) { if(que.empty()) { printf("-1 "); return ; } tank += que.top(); que.pop(); ans ++; } tank -= d; pos = A[i]; que.push(B[i]); } printf("%d ", ans); } int main() { scanf("%d%d%d", &N, &L, &P); for(int i = 0; i < N; i ++) scanf("%d%d", &A[i], &B[i]); solve(); return 0; }
以上是关于POJ 2431 Expedition的主要内容,如果未能解决你的问题,请参考以下文章