前言

从现在开始,这个博客要写一些题解了。起初,开这个博客只是好玩一样,没事就写写CSS、JS,然后把博客前端搞成了现在这个样子。以前博客只是偶尔记录一些东西,刷题也从来不记录,最近受一些学长的影响,突然觉得写解题报告也很有意思,以后基本上做的题,除了太水的,都会在这上面更新。

一直很想买一个域名,然后用博客框架搭一个自己的博客,以前用 WordPress 和 Hexo 都搭过博客,但是域名续费、虚拟主机(虽然可以用 Hexo+GithubPage/CodingPage 搭静态博客,但更新不方便,也没法随时更新,例如在机房,所以还是需要 WordPress 等框架)的花费和阅读量比太小,没必要去搭,也试过用免费的虚拟主机(000webhost),免费的域名(.tk .cf 等),但毕竟免费,速度慢,网页有水印(虽然屏蔽了),域名国内搜索引擎还不予收录,所以就丢弃了。目前会用这个博客园的博客,而且可能会用下去(其实现在阅读体验和私有博客也没什么大的区别了)。

说了这么多,进入正题吧。

题面

传送门

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

解题思路

这道题的标签是树形DP,但有一种更简便的做法。

首先我们可以预处理出 1~n 之间的转换关系,然后连边,形成一张图。

例如 4 的因数和是 3 ,那么 4 和 3 可以相互转换,那么在它们之间连一条有向边。

预处理完以后,我们得到了一张图。这个问题被转化成了求这张图的最长链。

那么怎么求图上的最长链呢?

从图上的任意一个结点开始,找到离这个结点最远的结点。然后再从这个结点找出离它最远的结点,它们之间的距离就是最长链的长度。

很明显,用 dfs 就可以求出最长链的长度了。我们首先从 1 开始 dfs(因为不管 n 是多少,点 1 必然存在),找到离它最远的结点,然后再 dfs 一遍,找到最远的结点就是答案。

代码

#include<bits/stdc++.h>
using namespace std;
long long last[200005],to[200005],nextt[200005],v[200005],top=0,d[200005];
long long maxx=0,ans=0;
void add(int a,int b){//前向星 nextt[++top]=last[a];to[top]=b;last[a]=top;
}
int n;
void dfs(int x,int t){v[x]=1;if (t>maxx){//如果当前的距离大于已知最长距离,那么更新距离并记录当前结点 maxx=t;ans=x;}for (int i=last[x];i;i=nextt[i]){//搜索与当前结点有联系的结点 if (!v[to[i]]){dfs(to[i],t+1);}}
}
int main(){cin>>n;for (int i=2;i<=n;i++){//预处理 int tmp=1;for (int j=2;j<=sqrt(i);j++){if (i==j){break;}if (i%j==0){tmp+=j+i/j;}}if ((int)sqrt(i)*(int)sqrt(i)==i){tmp-=sqrt(i);}if (tmp>=i){//如果约数和大于等于其本身,那么跳过 continue;}add(i,tmp);add(tmp,i);}dfs(1,0);maxx=0;memset(v,0,sizeof(v));dfs(ans,0);cout<<maxx;
}

转载于:https://www.cnblogs.com/abc2237512422/p/10343519.html

LOJ 10155 - 「一本通 5.2 例 3」数字转换相关推荐

  1. LOJ #10155. 「一本通 5.2 例 3」数字转换

    无向图的最长链怎么求?和树的直径求法相同. #include <bits/stdc++.h> using namespace std; const int N=5e4+5; int n,a ...

  2. LOJ 10155. 「一本通 5.2 例 3」数字转换

    题目:数字转换 思路: 对于每一个数,把它和它能够转移到的数之间连一条边. 由于不存在多元环,这个图本质上是一棵树. 然后在树上求最长链的长度就可以了. 具体实现就是dfs遍历整棵树,对于以每个点ii ...

  3. loj10155. 「一本通 5.2 例 3」数字转换

    思路: 树形dp求最长链. #include<cstdio> #include<iostream> #include<cstdlib> using namespac ...

  4. Loj 10115 「一本通 4.1 例 3」校门外的树 (树状数组)

    题目链接:https://loj.ac/problem/10115 题目描述 原题来自:Vijos P1448 校门外有很多树,学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的 ...

  5. LOJ #10222. 「一本通 6.5 例 4」佳佳的 Fibonacci

    题目链接 题目大意 $$F[i]=F[i-1]+F[i-2]\ (\ F[1]=1\ ,\ F[2]=1\ )$$ $$T[i]=F[1]+2F[2]+3F[3]+...+nF[n]$$ 求$T[n] ...

  6. #10164. 「一本通 5.3 例 2」数字游戏

    题目描述 原题题面 科协里最近很流行数字游戏.某人命名了一种不降数,这种数字必须满足从左到右各位数字成小于等于的关系,如 ,.现在大家决定玩一个游戏,指定一个整数闭区间 ,问这个区间内有多少个不降数. ...

  7. 数位dp(一)——Loj #10166. 「一本通 5.3 练习 1」数字游戏

    题目链接:https://loj.ac/problem/10166 题目大意 求区间[a,b]有多少数字满足数位加和%N等于0. 解题思路 看范围,很明显的数位dp.我们设定状态dp[pos][N][ ...

  8. LOJ #10166. 「一本通 5.3 练习 1」数字游戏

    题目:数字游戏 思路:数位dp 代码: #include<bits/stdc++.h> using namespace std;int a,b,n; int c[20]; int dp[2 ...

  9. 【C++】「一本通 1.1 例 4」加工生产调度

    「一本通 1.1 例 4」加工生产调度 [来源] [题目描述] [输入格式] [输出格式] [输入样例] [输出样例] [数据范围] [解析] [代码] [来源] 一本通题库-1425 LibreOJ ...

最新文章

  1. 【Qt】Qt容器总结
  2. 60个开发者不容错过的免费资源库
  3. db2和mysql性能_关于DB2数据库的性能分析记录
  4. parse() got an unexpected keyword argument 'transport_encoding'
  5. [置顶] C/C++超级大火锅
  6. java 模板实现原理,Java Web 模板代码生成器的设计与实现详解
  7. 使用lombok来简化你的Java Bean
  8. Oracle 中文排序
  9. LeetCode 29. 两数相除(位运算)
  10. Linux串口编程详解(转)
  11. 【GIS】GIS矢量空间分析(上)
  12. 红白机基本原理(一)总述
  13. Docker 中jmap报错:Can‘t attach to the process: ptrace(PTRACE_ATTACH问题
  14. Mqtt精髓系列之保留消息Retained Messages
  15. slack下载 csdn、_找出老板是否可以下载Slack DM
  16. Qt中的UI文件介绍
  17. docker配置镜像加速
  18. 联邦滤波matlab程序,联邦滤波器仿真
  19. 网易云音乐编码_音乐编码依据
  20. 键盘鼠标驱动安装 Vware遗留症 HP驱动

热门文章

  1. 如何全网智能识别文章页,识别正文和标题
  2. 用php进行联查,Thinkphp使用join联表查询的方法
  3. 数据、运营相关案例问答题(一)【牛客网:数据分析试题广场】
  4. ar虚拟现实电子沙盘软件制作
  5. 语音情感识别中的音频检测算法学习
  6. 美国L1签证和B1,E2签证的区别
  7. 来电设置小技巧 拒收垃圾短信 拒接不想接的电话
  8. 傲天AC EAG误配置导致Portal推送失败案例
  9. 主攻文推荐攻守都有系统_第五十五章 攻守转换
  10. 后台管理系统的美化以及模板的编写