zoukankan      html  css  js  c++  java
  • UVa

    特别水的题

    但是特别的是可以用一个记录来避免重复计算以达到降低复杂度的目的, 复杂度高的原因是已经计算过的周期长度的重复计算, 故应把已经计算过的数的周期长度保存下来

    题意

    考虑以下算法:
    1. 输入n
    2. 输出n
    3. 如果n=1然后停止
    4. 如果n是奇数: n <– n*3+1
    5. 其他的情况: n <– n/2
    6. 转向 2
    例如:对于输入22,输出将会是22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1。据推测,该算法对于任何整数将终止于1。尽管算法很简单,目前还不清楚这一猜想是否正确。但是对于所有整数n(0 < n < 1,000,000),已经过验证(事实上,符合规律的数比这还要多)。
    对于给定的n,是有可能计算出该算法共输出了多少个数的,包括结尾的1,这个数叫做n的周期长度。在上面的例子中,22的周期长度是16。对于任何两个数字i和j,求出在i和j之间的数中,周期长度最大的那个数的周期长度。

    AC代码

    该代码在不同OJ上的运行时间
    UVa - 100 20ms
    POJ - 1207 16ms
    SDUSTOJ - 1049 224ms ( 后台数据特意卡超时,只能提高复杂度来过题 )

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    int s[1000100];
    
    int problem( int n )
    {
        int num = 1;
        while( n != 1 )
        {
            if( n % 2 != 0 )
                n = n * 3 + 1;
            else
                n /= 2;
            num++;
        }
        return num;
    }
    
    int main()
    {
        int i, j;
        memset( s , 0 , sizeof(s) );
        while( ~scanf("%d%d",&i,&j) )
        {
            printf("%d %d",i,j);
            if(i > j)  //一个坑,如果输入大小顺相反应交换i,j
            {
                int t = i;
                i = j;
                j = t;
            }
            int m = 0;
            for( int k = i ; k <= j ; k++ )
            {
                if( !s[k] )  //
                    s[k] = problem(k);
                m = s[k] > m ? s[k] : m;
            }
            printf(" %d
    ",m);
        }
        return 0;
    }
  • 相关阅读:
    vue.js 第二课
    vue.js学习(第一课)
    2016-11-14看张大神的微博总结
    这几天的工作总结:
    调了一天的兼容总结下
    鸭式辩论
    prototype 原型
    前端ps常用的小技巧
    Android的开始之相对布局
    Android的开始之线性布局
  • 原文地址:https://www.cnblogs.com/JinxiSui/p/9740655.html
Copyright © 2011-2022 走看看