//给一个数,奇数乘3+1,偶数则除以2
//如此操作直至变为1,问过程中冲到的最大值
#include <bits/stdc++.h>
using namespace std;
int ma[30000003]; //node-root path max val
void dfs(int x){ //从根开始搜
//cout<<x<<endl;
if(x*2<=3000000){ //有这个儿子
ma[x*2]=max(ma[x],ma[x*2]);//儿子到根路径上最大值是其自身值与老豆到根路径上最大值的较大值
dfs(x*2); //深搜
}
if((x-1)%3==0&&(x-1)/3%2==1&&(x-1)/3>1){ //减一后是3的倍数且不只一倍还要是奇数
ma[(x-1)/3]=max(ma[x],ma[(x-1)/3]);//儿子到根路径上最大值是其自身值与老豆到根路径上最大值的较大值
dfs((x-1)/3); //深搜
}
}
int main(){
for(int i=1;i<=10000;i++)ma[i]=i;//每个点到根路径的最大值先记为自身
dfs(1); //然后从根开始深搜
int n,mx=1;;cin>>n; //输入N,定义答案为1
for(int i=1;i<=n;i++)mx=max(mx,ma[i]);//扫一次得每个点到根的路径上的最大值的最大值
cout<<mx<<endl; //输出最大值
return 0;
}
/*
样例输入:
10
样例输出:
52
*/
#include <bits/stdc++.h>
using namespace std;
int main(){
for(int tx=999999;tx>999000;tx--){ //模拟最大的一千个数
int mx=tx,x=tx; //最大值,当前值
while(x!=1){ //当前值未到1
if(x%2==0)x/=2; //偶数除2
else x=x*3+1,mx=max(x,mx); //奇数乘3+1
}
cout<<mx<<endl; //输出
}
return 0;
}
/*
有个BUG就是题目要求值是1000000以内,但是往上往的都远远不止这个值
用下面这个小程序模拟会发现有冲到7E8的值,然后就凉凉了GG
*/
校选拔赛C题
最新推荐文章于 2023-01-10 18:59:53 发布