UVa
来源:互联网 发布:js上拉查看图文详情 编辑:程序博客网 时间:2024/05/22 01:33
特别水的题
但是特别的是可以用一个记录来避免重复计算以达到降低复杂度的目的, 复杂度高的原因是已经计算过的周期长度的重复计算, 故应把已经计算过的数的周期长度保存下来
题意
考虑以下算法:
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\n",m); } return 0;}
阅读全文
0 0
- uva
- UVA
- UVA
- UVA
- uva
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- 在 linux 下使用 CMake 构建应用程序
- Mysql 索引的几个问题
- Oracle总结二
- 感受野receptive field个人理解
- 训练总结 12.17
- UVa
- Unity3D 网络通信_HTTP协议、处理Json格式返回值、请求加Oauth
- NodeJs创建项目
- 【转自MOS中文文章】在 Windows 平台的 Oracle 12.1 数据库版本上的 Oracle Home 用户
- Spring MVC处理前台到后台绑定时间格式、doble等数据的解决方式
- 指针小结
- vi和vim的区别
- Java8使List转为Map
- 什么是区块链?-包教包会版