LOJ 10155 - 「一本通 5.2 例 3」数字转换
前言
从现在开始,这个博客要写一些题解了。起初,开这个博客只是好玩一样,没事就写写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」数字转换相关推荐
- LOJ #10155. 「一本通 5.2 例 3」数字转换
无向图的最长链怎么求?和树的直径求法相同. #include <bits/stdc++.h> using namespace std; const int N=5e4+5; int n,a ...
- LOJ 10155. 「一本通 5.2 例 3」数字转换
题目:数字转换 思路: 对于每一个数,把它和它能够转移到的数之间连一条边. 由于不存在多元环,这个图本质上是一棵树. 然后在树上求最长链的长度就可以了. 具体实现就是dfs遍历整棵树,对于以每个点ii ...
- loj10155. 「一本通 5.2 例 3」数字转换
思路: 树形dp求最长链. #include<cstdio> #include<iostream> #include<cstdlib> using namespac ...
- Loj 10115 「一本通 4.1 例 3」校门外的树 (树状数组)
题目链接:https://loj.ac/problem/10115 题目描述 原题来自:Vijos P1448 校门外有很多树,学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的 ...
- 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] ...
- #10164. 「一本通 5.3 例 2」数字游戏
题目描述 原题题面 科协里最近很流行数字游戏.某人命名了一种不降数,这种数字必须满足从左到右各位数字成小于等于的关系,如 ,.现在大家决定玩一个游戏,指定一个整数闭区间 ,问这个区间内有多少个不降数. ...
- 数位dp(一)——Loj #10166. 「一本通 5.3 练习 1」数字游戏
题目链接:https://loj.ac/problem/10166 题目大意 求区间[a,b]有多少数字满足数位加和%N等于0. 解题思路 看范围,很明显的数位dp.我们设定状态dp[pos][N][ ...
- LOJ #10166. 「一本通 5.3 练习 1」数字游戏
题目:数字游戏 思路:数位dp 代码: #include<bits/stdc++.h> using namespace std;int a,b,n; int c[20]; int dp[2 ...
- 【C++】「一本通 1.1 例 4」加工生产调度
「一本通 1.1 例 4」加工生产调度 [来源] [题目描述] [输入格式] [输出格式] [输入样例] [输出样例] [数据范围] [解析] [代码] [来源] 一本通题库-1425 LibreOJ ...
最新文章
- 【Qt】Qt容器总结
- 60个开发者不容错过的免费资源库
- db2和mysql性能_关于DB2数据库的性能分析记录
- parse() got an unexpected keyword argument 'transport_encoding'
- [置顶] C/C++超级大火锅
- java 模板实现原理,Java Web 模板代码生成器的设计与实现详解
- 使用lombok来简化你的Java Bean
- Oracle 中文排序
- LeetCode 29. 两数相除(位运算)
- Linux串口编程详解(转)
- 【GIS】GIS矢量空间分析(上)
- 红白机基本原理(一)总述
- Docker 中jmap报错:Can‘t attach to the process: ptrace(PTRACE_ATTACH问题
- Mqtt精髓系列之保留消息Retained Messages
- slack下载 csdn、_找出老板是否可以下载Slack DM
- Qt中的UI文件介绍
- docker配置镜像加速
- 联邦滤波matlab程序,联邦滤波器仿真
- 网易云音乐编码_音乐编码依据
- 键盘鼠标驱动安装 Vware遗留症 HP驱动