POJ 2431 Expedition
2016-03-11 19:38
375 查看
贪心,优先级队列。
基本思路:走过一个加油站,先不要加油,把这个油量存到仓库,到油量不够的时候去仓库补油,补油优先选择油量大的。
细节较多,容易写错。
基本思路:走过一个加油站,先不要加油,把这个油量存到仓库,到油量不够的时候去仓库补油,补油优先选择油量大的。
细节较多,容易写错。
#include<cstdio> #include<cstring> #include<cmath> #include<queue> #include<algorithm> using namespace std; int n; struct Point { long long x; long long sum; }p[100000 + 10]; long long L, P; bool cmp(const Point&a, const Point&b) { return a.x<b.x; } int main() { while (~scanf("%d", &n)) { priority_queue<int>q; for (int i = 1; i <= n; i++) scanf("%lld%lld", &p[i].x, &p[i].sum); scanf("%lld%lld", &L, &P); for (int i = 1; i <= n; i++) p[i].x = L - p[i].x; sort(p + 1, p + 1 + n, cmp); if (p .x != L){ p[n + 1].x = L; p[n + 1].sum = 0; n++; } int ans = 0; long long pre = 0; for (int i = 1; i <= n; i++) { long long dis = p[i].x - pre; P = P - dis; if (p[i].x == L&&P >= 0) break; if (p[i].x == L) { while (P < 0 && (!q.empty())) { P = P + q.top(); q.pop(); ans++; } if (P < 0) ans = -1; break; } else { pre = p[i].x; if (P == 0) { q.push(p[i].sum); P = P + q.top(); q.pop(); ans++; } else if (P < 0) { while (P < 0 && (!q.empty())) { P = P + q.top(); q.pop(); ans++; } if (P < 0) { ans = -1; break; } else if (P == 0) { q.push(p[i].sum); P = P + q.top(); q.pop(); ans++; } else if (P>0) q.push(p[i].sum); } else q.push(p[i].sum); } } printf("%d\n", ans); } return 0; }
相关文章推荐
- 最近关于编程学习的一点小体会
- 懒省事的小明
- Anidrod-View Animation动画介绍
- 机器学习中的数据清洗与特征处理综述
- 实验0 了解和熟悉操作系统
- C++ Primer Plus学习:第十章
- MVC中的View层
- ThinkPHP3.2.3建立项目模板和模板赋值
- LEETCODE 190
- C++ Primer Plus学习:第九章
- HDU5584 上海赛铜牌题
- JS---子类调用父类的方法
- Android-XML转成View过程简述
- POJ 3186
- BZOJ3781 小B的询问 题解&代码 【附莫队总结】
- android热补丁初探之二 热补丁分析对比
- python 异常
- C++ Primer Plus学习:第八章
- 51nod 1013快速幂 + 费马小定理
- 谁获得了最高奖学金