Expetion(POJ2431)
来源:互联网 发布:centos squid 重启 编辑:程序博客网 时间:2024/05/21 19:32
问题描述:
你需要驾驶一辆卡车行驶L单位的距离。最开始时,卡车有P单位的汽油。每行驶一单位的距离要消耗一单位的汽油。如果途中汽油耗尽,卡车将无法继续前进,因而无法到达终点。在途中一共有N个加油站,第i个加油站距离起点距离为A[i],最多可以加B[i]单位的汽油。假设卡车油箱无限大,那么请问卡车能否到达终点,如果能到达输出最少加油次数,否则输出-1。
限制条件:
1<=N<=10000
1<=L<=1000000,1<=P<=1000000
1<=Ai< L,1<=Bi<=100
输入:
第一行输入三个数分别为N,L,P;
接下来N行,分别输入A[i]和B[i]
样例:
输入:
4 25 10
10 10
14 5
20 2
21 4
输出:
2
分析:
当我们在思考,当到达某个加油站时是否要进行加油时,我们可以换一种思考方式:当我们到达加油站i时,就获得了一次在之后任何时刻都可以加B[i]单位的汽油的权利。所以在没有汽油时我们再加油就可以了,而为了加油的次数最少,先加最大的B[i]单位的汽油即可。所以我们只需要将已达到的加油站的B[i]加入到一个优先队列里面即可。
代码:
#include <iostream>#include <queue>#include <cstdio>using namespace std;const int maxn = 10000;int A[maxn],B[maxn];int L,P,N;void solve(){ int ans = 0,tank = P, pos = 0; priority_queue<int> pq; for(int i=0;i<=N;i++) { int d = A[i] - pos; while(tank - d < 0) { if(pq.empty()) { printf("-1\n"); return ; } tank += pq.top(); pq.pop(); ans++; } tank -= d; pos = A[i]; pq.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); } A[N]=L; B[N]=0; solve(); return 0;}
1 0
- Expetion(POJ2431)
- poj2431
- POJ2431
- poj2431
- poj2431
- POJ2431
- POJ2431
- poj2431 Expedition
- POJ2431 Expedition
- poj2431 Expedition
- POJ2431 Expedition
- POJ2431--Expedition
- [水]POJ2431
- POJ2431-Expedition
- POJ2431 贪心
- POJ2431-Expedition
- poj2431 Expedition
- poj2431 Expedition 优先队列
- Java创建线程的两种方式
- 在php中的数组总添加一个元素
- BZOJ 4310: 跳蚤
- jsp页面存放位置
- dot.js
- Expetion(POJ2431)
- Android Touch事件全解析
- [数据结构]Graph之拓扑排序BFS&DFS实现
- Java内存模型与多线程数据可见性和操作的有序性
- HTML学习笔记之二(回到顶部 与 回到底部)
- 下拉列表多选的时候如何获取值
- util 将bean 独立出来 写法
- 如何通过HTML标记或JS代码实现跳转返回页面顶部
- Hbase 学习笔记一 》Table Scans