博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
复健运动poj2431
阅读量:4557 次
发布时间:2019-06-08

本文共 1526 字,大约阅读时间需要 5 分钟。

题目大意:

  一头牛从起点到终点,最开始有P升油,每走一公里漏一升油,路途上有许多加油点,油箱容量为无穷大,求能到终点的最小加油次数。

《挑战程序设计竞赛》建议首先处理输入数据,使之成为到起点的距离。

优先队列练习

用优先队列存储路过的加油点的油。每次取用最大值,这样会使加油次数尽量减少。每取出一次就ans++.

值得注意的是:需要增加距离起点为l的点,保证最后一个加油点到终点能成功走到,因为有可能存在最后的油量走不到终点的情况,所以这个是必须要加的。【WA无数次在这里。

1 #include 
2 #include
3 #include
4 using namespace std; 5 int n, tank, l, p, ans; 6 struct node{ 7 int l, r; 8 }a[10010]; 9 bool cmp(node a, node b){10 return a.l < b.l;11 }12 int main(){13 //freopen("1.in", "r", stdin);14 while(~scanf("%d", &n)){15 ans = 0, tank = 0;16 for(int i = 1; i <= n; i++){17 scanf("%d %d", &a[i].l, &a[i].r);18 }19 scanf("%d %d", &l, &p);20 for(int i = 1; i <= n; i++)a[i].l = l - a[i].l;21 n++;22 a[n].l = l;a[n].r = 0;23 sort(a+1,a+1+n, cmp);24 int pos = 0;25 tank = p;26 priority_queue
q;27 for(int i = 1; i <= n; i++){28 int d = a[i].l - pos;29 while(tank - d < 0){30 if(q.empty()){31 //printf("-1\n");32 ans = -1;33 break;34 }35 tank += q.top();36 q.pop();ans++;37 }38 if(ans == -1)break;39 tank -= d;40 pos = a[i].l;41 q.push(a[i].r);42 }43 printf("%d\n", ans);44 }45 }

 

转载于:https://www.cnblogs.com/z52527/p/7906792.html

你可能感兴趣的文章
第八遍:链接详解
查看>>
Qt5.5 使用smtp发邮件的各种坑
查看>>
js奇葩错误 字符串传递问题
查看>>
人之初,性本恶
查看>>
springboot 端口号
查看>>
使用AChartEngine画动态曲线图
查看>>
安卓项目五子棋代码详解(四)
查看>>
urllib 学习一
查看>>
bzoj4196 [Noi2015]软件包管理器——树链剖分
查看>>
kafka源码阅读环境搭建
查看>>
UI设计
查看>>
androidtab
查看>>
Windows Phone 自定义弹出框和 Toast 通知
查看>>
如何生成静态页面的五种方案
查看>>
php 事件驱动 消息机制 共享内存
查看>>
剑指offer 二叉树的bfs
查看>>
LeetCode Maximum Subarray
查看>>
让我们再聊聊浏览器资源加载优化
查看>>
underscore demo
查看>>
CSS hack
查看>>