HDU 6071 Lazy Running (Dijstra, 2017 Multi-Univ Training Contest 4)
来源:互联网 发布:大数据下的税收征管 编辑:程序博客网 时间:2024/06/04 18:13
Problem
四个打卡点
Limit
Idea
由于每条路径都可以无限次通过,故考虑可以在 1, 2 间往返跑,每次对距离的贡献为 当前点号,总距离,距离 mod 2*d[1][2]
数据下,不断记录在取模距离为 dist 的情况下,是否可以到达点 i 的方案 vis[dist][i]
。此处的总复杂度为
对其中的每种可行距离方案 dist , dist - K % (2*d[1][2]) + K
求最小
但仍需考虑一种情况,当总距离>= K
且到达 2 时,此时不应取模处理,而应直接记录最小值并停止其后续步骤。
Code
#include<bits/stdc++.h>using namespace std;int T, dis[5][5], nxt[5][2] = {0,0, 4,2, 1,3, 2,4, 3,1};bool vis[60010][5];long long k, K;struct Node { int cur; long long dist, distmod; Node(){} Node(int _cur, long long _dist, long long _distmod):cur(_cur), dist(_dist), distmod(_distmod){}} p, q;bool operator<(Node a, Node b) { return a.distmod > b.distmod;}long long dijstra() { long long mod = dis[1][2] * 2; if(K % mod == 0) return K; long long directAns = (K/dis[1][2] + 1ll) * dis[1][2]; memset(vis, 0, sizeof(vis)); k = K % mod; priority_queue<Node> que; que.push(Node(2, 0, 0)); vis[0][2] = 1; while(!que.empty()) { p = que.top(); que.pop(); if(p.dist > directAns) break; for(int i=0;i<2;i++) { q.cur = nxt[p.cur][i]; q.dist = p.dist + dis[p.cur][q.cur]; if(q.dist > K) q.distmod = q.dist; else q.distmod = q.dist % mod; if(q.dist > K && q.cur == 2) { directAns = min(directAns, q.dist); continue; } if(vis[q.distmod][q.cur]) continue; if(q.dist <= K) vis[q.distmod][q.cur] = 1; que.push(q); } } for(int i=k;i<mod;i++) if(vis[i][2]) return min(directAns, i-k+K); return directAns;}int main(){ scanf("%d", &T); while(T-- && scanf("%lld", &K)) { for(int i=1;i<=4;i++) { scanf("%d", &dis[i][i==4?1:i+1]); dis[i==4?1:i+1][i] = dis[i][i==4?1:i+1]; } printf("%lld\n", dijstra()); }}
阅读全文
0 0
- HDU 6071 Lazy Running (Dijstra, 2017 Multi-Univ Training Contest 4)
- hdu 6071 Lazy Running(优先队列+dijkstra)(2017 Multi-University Training Contest
- HDU 6078 Wavel Sequence (dp + 树状数组, 2017 Multi-Univ Training Contest 4)
- HDU 6069 Counting Divisors (2017 Multi-Univ Training Contest 4)
- HDU 6070 Dirt Ratio (二分+线段树, 2017 Multi-Univ Training Contest 4)
- HDU 6073 Matching In Multiplication (拓扑+DFS, 2017 Multi-Univ Training Contest 4)
- HDU 6074 Phone Call (LCA+并查集, 2017 Multi-Univ Training Contest 4)
- HDU 6076 Security Check (DP, 2017 Multi-Univ Training Contest 4)
- HDU 6072 Logical Chain (Biset+Kosaraju, 2017 Multi-Univ Training Contest 4)
- HDU 6058 Kanade's sum (链表, 2017 Multi-Univ Training Contest 3)
- HDU 6065 RXD, tree and sequence (LCA, 2017 Multi-Univ Training Contest 3)
- HDU 6046 hash (HASH, 2017 Multi-Univ Training Contest 2)
- HDU 6085 Rikka with Candies (bitset, 2017 Multi-Univ Training Contest 5)
- HDU 6090 Rikka with Graph (贪心+构造, 2017 Multi-Univ Training Contest 5)
- HDU 6086 Rikka with String (AC 自动机+状压 dp, 2017 Multi-Univ Training Contest 5)
- HDU 6093 Rikka with Number (2017 Multi-Univ Training Contest 5)
- HDU 6096 String (字典树, 2017 Multi-Univ Training Contest 6)
- HDU 6127 Hard challenge (极角排序+二分, 2017 Multi-Univ Training Contest 7)
- 自定义React图片上传组件
- java-打印出所有的“水仙花数”
- 常见排序算法小结一(C++实现)(未完)
- ThinkPHP5 行为和钩子
- MySQL创建用户与授权方法
- HDU 6071 Lazy Running (Dijstra, 2017 Multi-Univ Training Contest 4)
- 惟伊集团·银川分公司启动会圆满成功
- js盒子模型
- 如何改变matlab刻度范围,如果改变坐标轴刻度字体大小
- 【NPOI系列】一:Excel写入
- POJ
- Spark--Datasource(Hive)
- 百练2229:Sumsets题解
- 机器学习十三 STD(标准差)在Numpy与Pandas中的不同