1577 例题3 数字转换(LOJ10155) 约数计算 树上最长链(两次找最大深度)

总目录

在线测评地址(ybt)

在线测评地址(LOJ)

发现竟然读不懂题。努力静下来,再读题,总算有了眉目。

4→3→1→7

4的约数,不包括本身,1,2,约数和是1+2=3,
3的约数,不包括本身,1,约数和是1
7的约数,不包括本身,1,约数和是1
故可这样变换7->1->3->4

还是有些晕,还是要再找找其他可能变换途径。

进一步思考样例,找出7以内所有符合条件的数据

数值 约数和 符合题意 打上序号
1    1       否
2    1       是     1
3    1       是     2
4    1+2=3   是     3
5    1       是     4
6    1+2+3=6 否
7    1       是     5

选出符合题意的数,拼接在一起,发现是一棵树

进一步研究,发现最多变换步数是找这个树的最长链(红色部分)  

该题的基本思路有了:

找出n范围内所有符合题意的数据及约束和。

将符合题意的数据拼接成树。

找出树的最长链(完全是笔者对立的思路:考虑从根节点开始,找出最大深度对应的点,再以该对应点为根节点,继续寻找最大深度,这次的最大深度,就是最长链的长度)。 

该题,还需特判:

n==1时,输出0

在提交代码前,测试了几组数据

n==1输出0
n==2输出1
n==3输出2
n==4输出3
n==5输出3
n==6输出3
n==7输出3

 发现没有问题,提交AC,代码如下:

ybt

通过

测试点结果内存时间
测试点1答案正确616KB2MS
测试点2答案正确628KB3MS
测试点3答案正确620KB3MS
测试点4答案正确624KB2MS
测试点5答案正确640KB2MS
测试点6答案正确800KB3MS
测试点7答案正确848KB4MS
测试点8答案正确1084KB8MS
测试点9答案正确1596KB20MS
测试点10答案正确1776KB26MS

LOJ

#include <bits/stdc++.h>
#define maxn 50010
using namespace std;
struct node{
	int to,next;
}e[maxn<<1];
int head[maxn],tot,n,dep[maxn],mx,k;//dep[]记录深度(即离根的距离)
void add(int u,int v){
	tot++,e[tot].to=v,e[tot].next=head[u],head[u]=tot;
}
void init(){
	int x,y,z;
	scanf("%d",&n);
	for(x=2;x<=n;x++){
		y=1;
		for(z=2;z*z<=x;z++)
			if(x%z==0){
				y+=z;
				if(x/z!=z)
					y+=x/z;	
			}
		if(y<x){ 
			add(x,y),add(y,x);//无向图
		}
	}
}
void dfs(int u,int fa){
	int i,v;
	for(i=head[u];i;i=e[i].next){
		v=e[i].to;
		if(v==fa)continue;
		dep[v]=dep[u]+1;
		if(dep[v]>mx)mx=dep[v],k=v;
		dfs(v,u);
	}
}
int main(){
	init();
	if(n==1){//特判 
		printf("0\n");
		return 0;
	}
	dfs(1,-1);//第一遍找最大深度
	dep[k]=0;
	dfs(k,-1);//第二变找最大深度
	printf("%d\n",mx); 
	return 0;
} 

上述代码完全独立编写,没有参考任何资料。

该习得什么:

很关键的一点,建模,将数据连接成树.

约数计算.

树上最长链(两次找最大深度)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值