ZR#1012
2024-08-21 19:29:53
## ZR#1012
blog咕咕咕了好久,开始补。
解法:
一个很显然的性质, $ x $ 只能转移到 $ x+1 $ 或者 $ 2x $ 处,所以我们可以以此性质建图,即 $ x $ 向 $ x + 1 $ 和 $ 2x $ 处连边,然后跑一遍SPFA就行了,建图过程详见代码。
CODE:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
#define INF 2147483647
const int N = 1e6 + 100;
int dis[N],x,n;
bool vis[N];
queue<int> q;
inline void calc(int v,int u,int val) {
if(dis[v] > dis[u] + val) {
dis[v] = dis[u] + val;
if(!vis[v]) q.push(v),vis[v] = true;
}
}
inline void spfa() {
while(!q.empty()) {
int v = q.front();
q.pop();
if(v < n) calc(v + 1,v,1);
if(v > 0) {
calc(v - 1,v,1);
for(int i = 1 ; v * i <= n ; i++) {
if(v * (i + 1) > n) calc(n,v,2 * i + 4 + v * (i + 1) - n);
else calc(v * (i + 1),v,2 * i + 4);
}
}
vis[v] = false;
}
}
int main() {
scanf("%d%d",&x,&n);
for(int i = 0 ; i <= n ; i++) dis[i] = INF;
if(x > n) {
dis[0] = 3,dis[n] = x - n;
vis[x] = vis[n] = vis[0] = true;
q.push(0);
q.push(n);
} else {
dis[x] = 0;
vis[x] = 1;
q.push(x);
}
spfa();
printf("%d\n",dis[n]);
//system("pause");
return 0;
}
最新文章
- [No0000A2]“原始印欧语”(PIE)听起来是什么样子?
- Java中的void
- 百度地图定位经纬度返回4.9E-324有关问题
- PHP try catch
- figure元素
- 批量删除.pyo后缀的文件
- 无向图的最短路径算法JAVA实现
- 【产品更新】EVC8013 硬件更新!
- stl map高效遍历删除的方法 [转]
- 让你的Git水平更上一层楼的10个小贴士
- 4.2、Libgdx每个模块概述
- MySQL 异常错误码使用 及 对照表
- 【转】Nginx反向代理和负载均衡
- python --- 二分查找算法
- python之造测试数据-faker(转载)
- Apache启动不成功时,用命令行检测(新手)
- [转] 语音识别基本原理介绍----gmm-hmm中的embedded training (嵌入式训练)
- esp8266(0) AT指令
- 现代程序设计 homework-01
- phpstrom破解