[AtCoder - abc465_d ]X to Y题解

你可以对数字做两种操作:

把数字除以


K取整


/


⌊x/K⌋。这会让数字变小,相当于在族谱里往上找父亲。
把数字变成

y,满足


/

⌊y/K⌋=x。这相当于

x 是

y 的父亲,也就是在族谱里往下找孩子。

目标:从

X走到

Y,最少要走几步?

核心思路

找"共同祖先"

算法细节

记录所有"父亲"

寻找"儿子"

举个栗子

假设

10

K=10,

123

X=123,

45

Y=45。

Y 的族谱(记录在

map里):

45

45(距离

0

4

4(距离

1

1,

45

45的父)

0

0(距离

2

2,

4

4的父)

X 去认亲:

第一轮:

X是

123

123。

Y的族谱里有

123

123吗?没有。

X找爸爸变成

12

12。

第二轮:

X是

12

12。

Y的族谱里有

12

12吗?没有。

X找爸爸变成

1

1。

第三轮:

X是

1

1。

Y的族谱里有

1

1吗?没有。

X找爸爸变成

0

0。

第四轮:

X是

0

0。

Y的族谱里有

0

0吗?有(距离

Y是

2

2步)。

计算:

X走了3步:

123

/

10

12

/

10

1

/

10

0

123

/10

12

/10

1

/10

0

Y走了2步
0

×
10
+
4
4

×
10
+
5
45
0
×10+4

4
×10+5

45

总步数:
3
+
2

5

3+2=5步。

代码实现

#include<bits/stdc++.h>

using namespace std;

#define int long long

signed main(){

int T;

cin>>T;

while(T--){

int x,y,k;

cin>>x>>y>>k;

map<int,int>m;

int c=y,d=0;

while(c>0)mc=d++,c/=k;

m0=d,c=x,d=0;

int ans=INT_MAX;

while(1){

if(m.count©)ans=min(ans,d+mc);

if(!c)break;

c/=k,d++;

}

cout<<ans<<"\n";

}

return 0;

}

相关推荐
liulilittle5 分钟前
[OPENPPP2] ssea 算法详解(中文)
算法·x86·x64·simd·openppp2·ssea·base94
碧海银沙音频科技研究院13 分钟前
蓝牙耳机使用WSDF5361锂保芯片进入船运模式实现方法
嵌入式硬件·算法
过期的秋刀鱼!23 分钟前
学习曲线-过拟合和欠拟合要做什么以及原因
人工智能·python·深度学习·算法·机器学习·模型评估
m沐沐43 分钟前
【自然语言处理】词向量转换与中文文本情感分类——从CountVectorizer到朴素贝叶斯
人工智能·算法·机器学习·自然语言处理·分类·中文分词·词向量转换
啦啦啦啦啦zzzz1 小时前
设计模式:原型模式
c++·设计模式·原型模式
小保CPP1 小时前
OpenCV C++基于CNN模型的场景文本检测(OCR)
c++·人工智能·opencv·计算机视觉·cnn·ocr·光学字符识别
sali-tec1 小时前
C# 基于OpenCv的视觉工作流-章99-换背景
图像处理·人工智能·opencv·算法·计算机视觉
科学实验家1 小时前
01背包问题
算法
普通攻击往后拉1 小时前
Leetcode 448. 找到所有数组中消失的数字
算法·leetcode·职场和发展
郝学胜-神的一滴1 小时前
Qt 高级编程 037:QSS按钮样式封神指南
开发语言·c++·qt·软件工程·用户界面