SDUT 3322 DFS暴力 数论

来源:互联网 发布:淘宝链接地址怎么弄 编辑:程序博客网 时间:2024/06/05 21:56

Collatz问题

Time Limit: 250ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

一下迭代序列定义在整数集合上:

n = n/2 (n 是偶数)

n = n*3 + 1(n 是奇数)

应用以上规则,并且以数字13开始我们得到一下序列:

13,40,20,10,5,16,8,4,2,1

可以看出这个以13开始以1结束的序列一共经过了9次运算。虽然还没有被证明(Collatz问题),但是人们认为在这个规则下,以任何数字开始都会以结束。

 

以哪个不超过x的正整数开始,能得到运算次数最多的序列?

注意:一旦序列开始,也就是从第二项开始,项是可以超过x的。

输入

 

输了一个整数n,接下来n行,每行一个整数x (1 <=x<=1,000,000)

输出

 

对于每次询问,你需要计算出最多的运算次数是多少。为了节约输出时间,你只需要输出所有询问的答案之和 。

示例输入

3123

示例输出

8

提示

 

因为测试数据过大,建议使用高效的读入,比如scanf()

如果你觉得scanf()仍然不够快,可以参考一下读入方式。

 

#include 

 

template 

inline void read(T& x) {

    char ch; while (!((((ch=getchar())>='0') && (ch <= '9')) || (ch == '-')));

    x = ch-'0'; while (((ch=getchar())>='0') && (ch <= '9')) x = x*10+ch-'0';

}

 

int main()

{

    int a,b;

    read(a);//等价于scanf(“%d”,&a);

    read(b);//等价于scanf(“%d”,&b);

}

来源

 

示例程序

 
#include <cstdio>#include <cmath>#include <cctype>#include <vector>#include <queue>#include <cstring>#include <iostream>#include <algorithm>using namespace std;int num=0;int a[1000100];int dp[1000010];int DFS(long long int n){    if(n==1)    {        return 0;    }    if(n<1000010)   //防止越界    {        if(a[n])            return a[n];    //减少时间    }    if(n%2==0)    {        return DFS(n/2)+1; //运行累加    }    else    {        return DFS(n*3+1)+1;    }}int main(){    int n;    int Max=0;    for(int i=1; i<=1000001; i++)    {        a[i]=DFS(i);        if(Max<a[i])            Max=a[i];        dp[i]=Max;<span id="transmark"></span>    }    while(~scanf("%d",&n))    {        long long sum=0;        for(int i=0; i<n; i++)        {            int m;            scanf("%d",&m);            sum+=dp[m];        }        printf("%lld\n",sum);    }}


0 0
原创粉丝点击