poj2431java_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

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 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\n");

return ;

}

tank += que.top();

que.pop();

ans ++;

}

tank -= d;

pos = A[i];

que.push(B[i]);

}

printf("%d\n", 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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值