老程序员分享:LOJ10155数字转换

简介: 老程序员分享:LOJ10155数字转换

"

题目描述

如果一个数 x 的约数和 y (不包括他本身)比他本身小,那么 x 可以变成 y,y 也可以变成 x。例如 4 可以变为 3,1 可以变为 7。限定所有数字变换在不超过 n 的正整数范围内进行,求不断进行数字变换且不出现重复数字的最多变换步数。

输入格式

输入一个正整数 n。

输出格式

输出不断进行数字变换且不出现重复数字的最多变换步数。

样例

样例输入

7

样例输出

3

样例说明

一种方案为 4→3→1→7。

数据范围与提示

对于 100% 的数据,1≤n≤50000。

**求树的最长链问题,先预处理每个数的约数,将可以互相转化的数之间连边,很明显这是一颗树,我们要求树的最长路径。

1 #include

2 #include

3 #include

4 #include

5 using namespace std;

6 int sum【50005】 = {0},n,d1【50005】,d2【50005】;

7 void ready()

8 {

9 int i,j;

10 scanf(""%d"",&n);

11 for(i = 1;i <= n;i++)

12 {

13 for(j = 2;j <= n / i;j++)

14 {

15 if(i * j > n)

16 break;

17 sum【i * j】 += i;

18 }

19 }

20 }

21 void dp()

22 {

23 int i;

24 for(i = n;i >= 1;i--) //因为大数字一定是小数字的后代

25 {

26 if(sum【i】 < i) //sum【i】是i的父亲节点

27 {

28 if(d1【i】 + 1 > d1【sum【i】】)//修改sum【i】这点的最大值

29 {

30 d2【sum【i】】 = d1【sum【i】】;

31 //代码效果参考:https://v.youku.com/v_show/id_XNjQwNjU4MTYzMg==.html

d1【sum【i】】 = d1【i】 + 1;

32 }

33 else if(d1【i】 + 1 >d2【sum【i】】)

34 {

35 d2【sum【i】】 = d1【i】 + 1;

36 }

37 }

38 }

39 }

40 int main()

41 {

42 int i,ans = 0;

43 ready();

44 dp();

45 for(i = 1;i <= n;i++) //遍历所有的节点,找最大值+次大值的最大值

46 {

47 if(d1【i】 + d2【i】 > ans)

48 ans = d1【i】 + //代码效果参考:https://v.youku.com/v_show/id_XNjQwNjU3MTA3Ng==.html

d2【i】;

49 }

50 printf(""%d"",ans);

51 return 0;

52 }


"
image.png
相关文章
|
7月前
|
C语言
c语言编程练习题:7-30 念数字
c语言编程练习题:7-30 念数字
157 0
湖南大学Java编程题7. 输出较小数
湖南大学Java编程题7. 输出较小数
|
6月前
|
机器学习/深度学习 资源调度
技术经验解读:【常用】数学符号及读法大全
技术经验解读:【常用】数学符号及读法大全
79 0
|
6月前
用人话教会你各个进制的意思和进制间的转化!!!
用人话教会你各个进制的意思和进制间的转化!!!
|
6月前
|
机器学习/深度学习
【Acwing积累】第一周(完全数、只出现一次的字符)
【Acwing积累】第一周(完全数、只出现一次的字符)
|
7月前
|
存储 C语言
C语言程序设计——ASCII码
C语言程序设计——ASCII码
|
7月前
|
算法 搜索推荐 程序员
C语言第二十六练 实现罗马数字转整数
C语言第二十六练 实现罗马数字转整数
110 0
|
C语言
【C语言航路外传】进制转换
【C语言航路外传】进制转换
63 0
|
数据采集 存储 数据挖掘
【每周一坑】罗马数字转换
由图可知,螺旋数组中的数字运动方向依次 右 -> 下 -> 左 -> 上 -> 右 这样的循环,在合适的条件下变换累加方向即可。
|
C语言
下面【整型提升】的例题,你会几道?学完这一课,你将真正拿捏整型提升问题
下面【整型提升】的例题,你会几道?学完这一课,你将真正拿捏整型提升问题
150 0
下面【整型提升】的例题,你会几道?学完这一课,你将真正拿捏整型提升问题

热门文章

最新文章