51nod1288 汽油补给
来源:互联网 发布:艾斯臣鞋子怎么样知乎 编辑:程序博客网 时间:2024/04/28 22:52
这不是就noip旅行家的预算吗。只不过这个每公里消耗一升油,感觉更简单了些。
贪心,每次找一个点后面第一油价比它低的点,想办法到那里让油全部用完。找它后面第一个比它价格低的点可以用单调栈处理。
#include<stdio.h>#include<stack>#include<iostream>using namespace std;typedef unsigned long long ll;const int N = 200000;ll d[N], p[N], pre[N];ll t, n, k, top;ll s[N];ll dfs(ll l, ll r){ ll pos = l; ll ans = 0; while(pre[pos] <= r){ int i = pre[pos]; if(k >= d[i] - d[pos]) { k -= d[i] - d[pos]; pos = i; continue; } if(d[i] - d[pos] <= t){ ans += (d[i] - d[pos] - k) * p[pos]; k = 0; pos = i; }else { ans += (t - k) * p[pos]; k = t - (d[pos + 1] - d[pos]); pos++; } } return ans; }int main(){ //freopen("7_in.txt", "r", stdin); ll ok = 0; scanf("%lld%lld", &n, &t); for(ll i = 0; i < n; i++){ scanf("%lld%lld", &d[i + 1], &p[i]); if(d[i + 1] > t) ok = 1; d[i + 1] += d[i]; } for(int i = n - 1; i >= 0; i--){ while(top && p[i] < p[s[top]]){ top--; } if(top == 0) pre[i] = n; else pre[i] = s[top]; s[++top] = i; } pre[n] = n + 1; if(ok) puts("-1"); else printf("%lld\n", dfs(0, n)); return 0;}
阅读全文
0 0
- 51nod1288 汽油补给
- 【51Nod1288】汽油补给
- [贪心] 51Nod1288 汽油补给
- 【贪心+ST算法+单调栈】51Nod1288[汽油补给]题解
- 51nod 1288:汽油补给
- 51Nod-1288-汽油补给
- 51Nod-1288-汽油补给
- 汽油补给
- 【51nod 1288 汽油补给 】 贪心 & 思维
- 51nod 1288 汽油补给【贪心】【ST表】【单调栈】
- 51nod 1288 汽油补给[贪心][st表][单调栈]
- [贪心+单调队列+ST算法]51 nod 1288 ——汽油补给
- 1288 汽油补给(贪心+单调栈)
- 汽油涨价
- 汽油依赖
- java 知识补给
- 汽油又涨价了
- 吐槽~92#汽油
- 简单错误程序——INF;调试到n==1,sum就inf
- 如何将Java Web项目转换为Java项目?
- 最小生成树之Kruskal算法 Java实现
- Oozie和Azkaban的技术选型和对比
- 1
- 51nod1288 汽油补给
- linux下安装RStudio Server
- laravel 5.0 artisan 命令列表(中文简体)
- java-----基础(2)
- CSUOJ-1978: LXX的图论题(Flyod)
- 基于梯度下降法的三层神经网络的C++实现(支持保存和读取)
- 5.2 TensorFlow:模型的加载,存储,实例
- DFS(深度优先搜索)弊端:不一定是最优路径
- HDU-1394 Minimum Inversion Number (逆序数,线段树或树状数组)