Lazy Running

思路

还是利用同余的思想,假设存在一条长度为kkk的路,那么也一定存在一条k+basek + basek+base的路base=2∗min(d1,d2)base = 2 * min(d1, d2)base=2∗min(d1,d2)。

dis[i][j]=xdis[i][j] = xdis[i][j]=x表示的是,从2−>i2 -> i2−>i点x≡j(modbase)x \equiv j \pmod {base}x≡j(modbase)的满足条件的最小的xxx,所以我们只要求出所有的dis[2][i]dis[2][i]dis[2][i],再通过同余的性质去得到我们的最短路的花费,对于dis[2][i]>kdis[2][i] > kdis[2][i]>k我们取min(ans,dis[2][i])min(ans, dis[2][i])min(ans,dis[2][i]),否则的话,我们取min(ans,dis[2][i]+(k−dis[2][i]+mid−1)/mod∗mod)min(ans, dis[2][i] + (k - dis[2][i] + mid - 1) / mod * mod)min(ans,dis[2][i]+(k−dis[2][i]+mid−1)/mod∗mod),之后我们就可以得到我们的正确解了

代码

/*Author : lifehappy
*/
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include <bits/stdc++.h>
#define mp make_pair
#define pb push_back
#define endl '\n'using namespace std;typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;const double pi = acos(-1.0);
const double eps = 1e-7;
const int inf = 0x3f3f3f3f;inline ll read() {ll f = 1, x = 0;char c = getchar();while(c < '0' || c > '9') {if(c == '-')    f = -1;c = getchar();}while(c >= '0' && c <= '9') {x = (x << 1) + (x << 3) + (c ^ 48);c = getchar();}return f * x;
}void print(ll x) {if(x < 10) {putchar(x + 48);return ;}print(x / 10);putchar(x % 10 + 48);
}const int N = 6e4 + 10;ll dis[5][N], k, d1, d2, d3, d4, mod;vector< pair< int, ll > > G[5];void Dijkstra() {priority_queue< pair< ll, int >, vector< pair< ll, int > >, greater< pair< ll, int > > > q;q.push(mp(0, 2));memset(dis, 0x3f, sizeof dis);dis[2][0] = 0;while(q.size()) {auto temp = q.top();q.pop();if(temp.first > dis[temp.second][temp.first % mod]) continue;for(auto i : G[temp.second]) {int to = i.first;ll w = i.second + temp.first;if(dis[to][w % mod] > w) {dis[to][w % mod] = w;q.push(mp(w, to));}}}
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);int t = read();while(t--) {k = read(), d1 = read(), d2 = read(), d3 = read(), d4 = read();mod = min(d1, d2) * 2;for(int i = 1; i <= 4; i++) G[i].clear();G[1].pb(mp(2, d1)), G[1].pb(mp(4, d4));G[2].pb(mp(3, d2)), G[2].pb(mp(1, d1));G[3].pb(mp(2, d2)), G[3].pb(mp(4, d3));G[4].pb(mp(3, d3)), G[4].pb(mp(1, d4));Dijkstra();ll ans = 0x3f3f3f3f3f3f3f3f;for(int i = 0; i < mod; i++) {if(k < dis[2][i]) ans = min(ans, dis[2][i]);else {ans = min(ans, dis[2][i] + (k - dis[2][i] + mod - 1) / mod * mod);}}printf("%lld\n", ans);}return 0;
}

HDU 6071 Lazy Running(同余最短路的应用)相关推荐

  1. HDU - 6071 Lazy Running 同余最短路 + 分层

    传送门 题意: 给定四个点构成一个环,给出四个点之间的距离,让后从222号点出发,最终回到222号点,求经过的距离>=k>=k>=k的最小距离. 思路: 由于从222开始,最终在22 ...

  2. HDU 6071 Lazy Running

    链接HDU 6071 Lazy Running 给出四个点1,2,3,4,1和2,2和3,3和4,4和1之间有路相连,现在从2点出发,最后回到2点,要求路径大于等于\(K\),问路径长度最短是多少,\ ...

  3. HDU 6071 Lazy Running (最短路)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=6071 题解 又是一道虐信心的智商题... 首先有一个辅助问题,这道题转化了一波之后就会化成这个问题: ...

  4. 【算法笔记】一步一步推出来的同余最短路优化思路(千字长文,超详细)

    整理的算法模板合集: ACM模板 目录 同余最短路 例题1:luogu P3403 跳楼机 例题2:luogu P2371 [国家集训队]墨墨的等式 例题3:luogu P2662 牛场围栏 同余最短 ...

  5. 牛客 - Yuki with emofunc and playf(同余最短路)

    题目链接:点击查看 题目大意:初始时给出一个数字 y=1y=1y=1 和一个辅助数字 xxx,每回合可以执行两种操作中的一种: y=y∗10y=y*10y=y∗10 y=y+x−1y=y+x-1y=y ...

  6. P2662 牛场围栏(同余最短路)

    P2662 牛场围栏 思路 假设我们已经知道同余最短路是什么了,这里就不再过多赘述. 我们要尽可能地得到更多地课建成地边,那么我们必然要选一个basebasebase相对小的,因此我们可以对所有的棍子 ...

  7. 同余最短路(P3403 跳楼机)

    同余最短路 前置 给定m个数,这m个数可以重复取,问最大的这m个数不能拼成的数,或者给定一定范围,范围里有多少个数是这m个数可以拼成的,对于这种问题我们可以考虑同余最短路的算法. P3403 跳楼机 ...

  8. 湖南大学第十六届程序设计竞赛 B Yuki with emofunc and playf 同余最短路

    传送门 文章目录 题意: 思路: 题意: 初始有一个数111,你每次可以将其∗10*10∗10或者+(x−1)+(x-1)+(x−1),现在给你xxx,问最少经过多少步能到达nnn. 1≤n≤1e6, ...

  9. P2371 [国家集训队]墨墨的等式 同余最短路

    传送门 题意: 思路: 一个同于最短路的板子题,初始的时候值为0,所以设dis[0]=0dis[0]=0dis[0]=0,让后选择一个最小的a[i]a[i]a[i]作为basebasebase,跑一遍 ...

最新文章

  1. mysql show作用_MySQL show的用法
  2. C++网络游戏程序员笔试题
  3. openstack创建实例报错Exceeded maximum number of retries
  4. Python3NumPy——数组(2)之数学空间与NumPy空间
  5. BLE 配对后通信其中一方LTK丢失情况(转自襄坤在线)
  6. python简单语句-7. 简单语句
  7. 十大有用但又偏执的Java编程技术
  8. Invalid attempt to read when no data is present.
  9. python创建gui界面_你要的 Python 创建 GUI 用户界面程序,来咯
  10. java 二叉树转数组_java二叉树怎么转成数组?java怎么实现二叉树?
  11. java 截位法保留小数_资料分析——截位法
  12. 【钉钉-场景化能力包】考勤统计
  13. 撼龙图怎么开鸿蒙炁灵,《一人之下》藏金图怎么玩 撼龙藏金图高概率出绝世炁灵技巧...
  14. js 校验手机号码格式
  15. 【CSP-S 2019模拟】题解
  16. Vue开发警告[Vue warn]: Avoid replacing instance root $data. Use nested data properties instead.
  17. Java基本控制流程的理解之输出三角形和乘法表
  18. 关于Intriguing properties of neural networks的理解
  19. 迅雷2014C++研发笔试卷C解题分析
  20. 闪迪u盘不能识别好办法_闪迪u盘无法识别恢复

热门文章

  1. python重定向_在Python中使用urlopen()防止“隐藏”重定向
  2. 华为电视鸿蒙系统好用吗,【图片】华为鸿蒙系统的厉害之处在于 你可能非用不可 !【手机吧】_百度贴吧...
  3. 地球上最快的速度......
  4. 别薅了别薅了!!!再薅就真的被薅秃了!!
  5. 你和女朋友的婚后老年生活!
  6. 成年人改变生活的方式,都是从它开始
  7. 大数据告诉你,中国女人有多勤奋
  8. 日本老爷爷坚持17年用Excel作画,我可能用了假的Excel···
  9. mysql索引有几种使用索引的好处_mysql索引的类型和优缺点
  10. 项目管理六大制约因素_用PCTS理念做好项目管理规划(优秀项目管理者必知)...