博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ZOJ-3699 Dakar Rally 单调队列
阅读量:5811 次
发布时间:2019-06-18

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

题意:比赛的时候想了各种的贪心方案,最后还是没有把这题搞出来......废话不多说,题目给定了一条条给定了顺序的路径,这些路径是后面要一一走过的,每条路径有一个长度,单位长度消耗汽油的量以及该条公路上加油站的汽油单价。告诉你路径条数N,油箱容积K,问如何安排加油是的行走完所有路径的花费最少。

解法:该题有一个很巧妙的解法就是每到一个油站都加满油箱,队列里面保留了走过前面路径后保留的最便宜的油,每次从队列中取出最便宜的油行进这一段路程。在维持一个汽油价格单调递增时,具体过程如下:

1.当队尾不为空时,每次从队尾向前遍历,如果元素单价高于当前路线加油站的汽油单价,替换之,知道遇到价格比其低的汽油或者队列为空位置。

2.从队列中从前往后选择合适的汽油来行进该段路劲,并且更新价格。

代码如下:

#include 
#include
#include
#include
#include
#include
using namespace std;int N, K;typedef long long LL;struct road { int len, cpm, pri;}e[100005];struct gas { int vol, pri; gas(int v, int p) : vol(v), pri(p) {} gas() {}};deque
dq;int vol;void solve() { LL ret = 0; vol = 0; while (!dq.empty()) { dq.pop_front(); } for (int i = 0; i < N; ++i) { while (!dq.empty() && dq.back().pri > e[i].pri) { vol -= dq.back().vol; dq.pop_back(); } dq.push_back(gas(K-vol, e[i].pri)); // 以上维护好一个单调递增的汽油序列 int nd = e[i].len * e[i].cpm; // 需求一定是一个不大于K的数值 vol = K - nd; while (nd) { gas & cur = dq.front(); // 引用队首的汽油 int Min = min(nd, cur.vol); cur.vol -= Min, nd -= Min; ret += 1LL * Min * cur.pri; if (!cur.vol) dq.pop_front(); } } printf("%lld\n", ret);}int main(){ int T; scanf("%d", &T); while (T--) { scanf("%d %d", &N, &K); bool flag = true; for (int i = 0; i < N; ++i) { scanf("%d %d %d", &e[i].len, &e[i].cpm, &e[i].pri); if (1LL * e[i].len * e[i].cpm > K) { // 可能会溢出 flag = false; } } if (!flag) { puts("Impossible"); continue; } solve(); } return 0;}

 

转载于:https://www.cnblogs.com/Lyush/archive/2013/05/08/3066626.html

你可能感兴趣的文章
MySQL 备份与恢复
查看>>
TEST
查看>>
PAT A1037
查看>>
(六)Oracle学习笔记—— 约束
查看>>
[Oracle]如何在Oracle中设置Event
查看>>
top.location.href和localtion.href有什么不同
查看>>
02-创建hibernate工程
查看>>
Scrum之 Sprint计划会议
查看>>
svn命令在linux下的使用
查看>>
Gradle之module间依赖版本同步
查看>>
java springcloud版b2b2c社交电商spring cloud分布式微服务(十五)Springboot整合RabbitMQ...
查看>>
10g手动创建数据库
查看>>
Windwos Server 2008 R2 DHCP服务
查看>>
UVa 11292 勇者斗恶龙(The Dragon of Loowater)
查看>>
白话算法(7) 生成全排列的几种思路(二) 康托展开
查看>>
d3 v4实现饼状图,折线标注
查看>>
微软的云策略
查看>>
Valid Parentheses
查看>>
【ES6】数值的扩展
查看>>
性能测试之稳定性测试
查看>>