zzulioj - 2597: 角谷猜想2

题目链接:

http://acm.zzuli.edu.cn/problem.php?id=2597

题目描述

大家想必都知道角谷猜想,即任何一个自然数,如果是偶数,就除以2,如果是奇数,就乘以3再加1。最后,经过若干次迭代得到1。也就是说,不管怎样迭代,不断除以2以后,最后是1,我们称一个数字经过角谷猜想变化得到1迭代的次数称为角谷序列步长,例如数字3,它的角谷猜想变化过程为3->10->5->16->8->4->2->1,所以它的角谷序列步长为8。小D同学想知道区间[1,n]内,角谷序列步长最大的那个数字是谁?

输入

多组测试数据,以EOF结束
每组测试数据一行,每行一个正整数n(1<=n<=4000000)。

输出

对于每组测试数据输出一行,每行一个数字,表示区间[1,n]内角谷序列步长最大的那个数字,如果这样的数字有多个,输出最小的那个

样例输入 Copy

1
2
3

样例输出 Copy

1
2
3这题n给的数字很大,显然需要我们打表,而且直接打表的话也很浪费时间,所以我们可以用记忆化搜索的方式,储存之前计算的值在之后计算用的时候用上以减少计算量
#include<set>
#include<map>
#include<stack>
#include<queue>
#include<cmath>
#include<cstdio>
#include<cctype>
#include<string>
#include<vector>
#include<climits>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define max(a, b) (a > b ? a : b)
#define min(a, b) (a < b ? a : b)
#define mst(a) memset(a, 0, sizeof(a))
#define _test printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n")
using namespace std;
typedef long long ll;
typedef pair<int, int> P;
const double eps = 1e-7;
const int INF = 0x3f3f3f3f;
const ll ll_INF = 0x3f3f3f3f3f3f3f;
const int maxn = 4e6+10;
ll res[maxn] = {0,1};
//递归
ll solve(ll x) {
    ll cnt;
    if (x < maxn && res[x]) //利用中间结果减少计算量
        return res[x];
    cnt = solve(x&1 ? x*3 + 1 : x >> 1) + 1;
    return cnt;
}
//循环版
//ll solve(ll x) {
//    ll cnt = 1;
//    while(x != 1) {
//        x&1 ? x = x*3 + 1 : x >>= 1;
//        ++cnt;
//        if (x <= maxn && res[x])
//            return cnt+res[x]-1;
//    }
//    return cnt;
//}
int main(void) {
    for(int i = 2; i<maxn; ++i)
        res[i] = solve(i);
    P _max = {res[1], 1};
    res[1] = 1;
    for(int i = 2; i<maxn; ++i) { //求解1~n内步长最大的数
        if (res[i] < _max.first)
            res[i] = _max.second;
        else if (res[i] > _max.first) {
            _max.first = res[i];
            _max.second = i;
            res[i] = i;
        }
        //printf("%lld ", res[i]);
    }
    int num;
    while(~scanf("%d", &num))
        printf("%lld\n", res[num]);
    return 0;
}

原文地址:https://www.cnblogs.com/shuitiangong/p/12070540.html

时间: 2024-10-10 18:08:31

zzulioj - 2597: 角谷猜想2的相关文章

验证角谷猜想(hd1279)

验证角谷猜想 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 7196    Accepted Submission(s): 3700 Problem Description 数论中有许多猜想尚未解决,其中有一个被称为“角谷猜想”的问题,该问题在五.六十年代的美国多个著名高校中曾风行一时,这个问题是这样描述的:任何一个大于一的自然数,如果

角谷猜想---记忆化搜索

2969 角谷猜想 时间限制: 1 s 空间限制: 32000 KB 题目描述 Description 所谓角谷猜想,即给定一个正整数 n,对 n 反复进行下列两种变换: 1)如果n是偶数,就除以2: 2)如果n是奇数,就乘以3加1. 最后的结果总是1. 我们把从 n 变换到 1 所需要进行的变换次数称做 n 的变换长度,如数字 7 的变换为: 7-22-11-34-17-52-26-13-40-20-10-5-16-8-4-2-1 共进行了 16 次变换,因而 7 的变换长度为 16. Wis

hdu 1279 验证角谷猜想(简单的模拟)

Problem Description 数论中有许多猜想尚未解决,其中有一个被称为“角谷猜想”的问题,该问题在五.六十年代的美国多个著名高校中曾风行一时,这个问题是这样描述的:任何一个大于一的自然数,如果是奇数,则乘以三再加一:如果是偶数,则除以二:得出的结果继续按照前面的规则进行运算,最后必定得到一.现在请你编写一个程序验证他的正确性. Input 本题有多个测试数据组,第一行为测试数据组数N,接着是N行的正整数. Output 输出验证“角谷猜想”过程中的奇数,最后得到的1不用输出:每个测试

openjudge 角谷猜想

总时间限制:  1000ms 内存限制:  65536kB 描述 所谓角谷猜想,是指对于任意一个正整数,如果是奇数,则乘3加1,如果是偶数,则除以2,得到的结果再按照上述规则重复处理,最终总能够得到1.如,假定初始整数为5,计算过程分别为16.8.4.2.1. 程序要求输入一个整数,将经过处理得到1的过程输出来. 输入 一个正整数N(N <= 2,000,000) 输出 从输入整数到1的步骤,每一步为一行,每一部中描述计算过程.最后一行输出"End".如果输入为1,直接输出&qu

2969 角谷猜想

2969 角谷猜想 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 所谓角谷猜想,即给定一个正整数 n,对 n 反复进行下列两种变换: 1)如果n是偶数,就除以2: 2)如果n是奇数,就乘以3加1. 最后的结果总是1. 我们把从 n 变换到 1 所需要进行的变换次数称做 n 的变换长度,如数字 7 的变换为: 7-22-11-34-17-52-26-13-40-20-10-5-16-8-4-2-1 共进行了 1

杭电 HDU 1279 验证角谷猜想

验证角谷猜想 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6653    Accepted Submission(s): 3417 Problem Description 数论中有许多猜想尚未解决,其中有一个被称为"角谷猜想"的问题,该问题在五.六十年代的美国多个著名高校中曾风行一时,这个问题是这样描述的:任何一个大于一的

Openjudge-计算概论(A)-角谷猜想

描述: 所谓角谷猜想,是指对于任意一个正整数,如果是奇数,则乘3加1,如果是偶数,则除以2,得到的结果再按照上述规则重复处理,最终总能够得到1.如,假定初始整数为5,计算过程分别为16.8.4.2.1. 程序要求输入一个整数,将经过处理得到1的过程输出来. 输入一个正整数输出从输入整数到1的步骤,每一步为一行,每一部中描述计算过程,假定输入为7,则输出为:7*3+1=2222/2=1111*3+1=3434/2=1717*3+1=5252/2=2626/2=1313*3+1=4040/2=202

1-5-18:角谷猜想

描述 所谓角谷猜想,是指对于任意一个正整数,如果是奇数,则乘3加1,如果是偶数,则除以2,得到的结果再按照上述规则重复处理,最终总能够得到1.如,假定初始整数为5,计算过程分别为16.8.4.2.1. 程序要求输入一个整数,将经过处理得到1的过程输出来. 输入一个正整数N(N <= 2,000,000)输出从输入整数到1的步骤,每一步为一行,每一部中描述计算过程.最后一行输出"End".如果输入为1,直接输出"End".样例输入 5 样例输出 5*3+1=16

角谷猜想

描述 所谓角谷猜想,是指对于任意一个正整数,如果是奇数,则乘3加1,如果是偶数,则除以2,得到的结果再按照上述规则重复处理,最终总能够得到1.如,假定初始整数为5,计算过程分别为16.8.4.2.1. 程序要求输入一个整数,将经过处理得到1的过程输出来. 输入一个正整数N(N <= 2,000,000)输出从输入整数到1的步骤,每一步为一行,每一部中描述计算过程.最后一行输出"End".如果输入为1,直接输出"End".样例输入 5 样例输出 5*3+1=16