LFYZ-OJ ID: 1026 数的计数(数的计算)NOIP2001
2024-10-14 14:14:39
数的计算(数的计数)
题目描述
我们要求找出具有下列性质数的个数(包含输入的自然数n)。先输入一个自然数n(n<=1000),然后对此自然数按照如下方法进行处理:
- 不作任何处理;
- 在它的左边加上一个自然数,但该自然数不能超过原数的一半;
- 加上数后,在新加上数的左边继续按此规则进行处理,直到不能再加自然数为止.
例如:
输入: 6
满足条件的数为 6 (此部分不必输出)
16
26
126
36
136
输出: 6
输入
只有一行一个整数,为自然数n(n<=1000)
输出
输出满足条件数的个数
样例输入
6
样例输出
6
分析
手动按照上述过程进行计算,会发现这是个递归的过程,对每一个原始数字m,在前面加i(1,2,3,...m/2),即
h(n)=1+h(1)+f(2)+...+h(n/2)
,对于每一个i,要按照同样的规则进行,这用递归可以实现(见例程1),递归过程中,每遇到一个原始数,计数器加1,用来统计个数。例程1在OJ中会显示超时,这是必然的,当n很大时,递归的过程就会很长,这主要源于其中会做大量的重复计算,每次计算h(n),都要重复计算h(1)....h(n/2),这样的问题在使用递归计算斐波那契数f(n)时,也会遇到,程序效率很低。解决的一个途径是使程序具有记忆功能,已计算出的数字就无需再次计算,直接使用即可。例程2使用数组实现了带记忆功能的递归,可以通过OJ系统。
也可以使用递推的方法来解决问题:已知
h(n)=1+h(1)+h(2)+...+h(n/2)
,这就是一个递归式,程序写起来很容易(见例程3),两层for循环就可完成,递推比起无记忆的递归来效率要高得多。例程1是指数级的时间复杂度,而例程3的时间复杂度为O(n2)。问题可以进一步简化。通过对上面的公式进行推导可以发现:n为奇数时,
h(n)=h(n-1)
,n为偶数时,h(n)=h(n-1)+h(n/2)
,看懂了吗,使用这两个公式,可以将时间复杂度降低到O(n),见例程4。
例程1
#include<iostream>
using namespace std;
int ans; //计数器
void dfs(int m){
ans++; //每出现一次原始数,ans++
for(int i=1; i<=m/2; i++){
dfs(i); //递归
}
}
int main(){
int n;
cin>>n;
dfs(n);
cout<<ans;
return 0;
}
例程2
#include<iostream>
using namespace std;
int h[1001]; //记忆数组,存储计算出的h[m]
void dfs(int m){
if(h[m]!=0) return; //有记忆,不再递归
h[m]=1; //无记忆,初始化为1,递归累加计算
for(int i=1; i<=m/2; i++){
dfs(i); //递归
h[m]+=h[i]; //累加
}
}
int main(){
int n;
cin>>n;
dfs(n);
cout<<h[n];
return 0;
}
例程3
#include<iostream>
using namespace std;
int h[1001];
int main(){
int n;
cin>>n;
h[1]=1; //初始化第一项h[1]
for(int s=2;s<=n;s++){ //对第s项
h[s]=1; //数字s自己算一个
for(int i=1;i<=s/2;i++) h[s]+=h[i];
}
cout<<h[n];
return 0;
}
例程4
#include<iostream>
using namespace std;
int main(){
int n;
cin>>n;
h[1]=1; //初始化第一项
for(int i=2; i<=n; i++){
h[i]=h[i-1]; //递推
if(i%2==0) h[i]+=h[i/2]; //i为偶数时
}
cout<<h[n];
return 0;
}
最新文章
- HackerRank ";Kruskal (MST): Really Special Subtree";
- Android之activity初讲
- 喜大普奔!Fanvas正式对外开源了,一键把Flash转为Canvas动画!移动终端动画开发不再困难。
- XAML(3) - 附带属性
- ASP.NET 4的Demo实践:URL路由改进支持
- Android:布局合集
- js 常用正则表达式(不断维护中)
- Java模拟post提交表单数据
- 《JAVA与模式》之门面模式
- 推荐使用国内的豆瓣源安装Python插件
- 深谈auto变量
- 如何在一个项目中同时包含mvc建站、webapi接口
- java数据结构和算法02(栈)
- kubenetes_V1.14.0 安装部署
- 一个磁盘I/O故障导致的AlwaysOn FailOver 过程梳理和分析
- MyLog
- Java中instanceof与getClass的区别
- linux下 彻底修改python的包/模块导入路径
- 『TensorFlow Internals』笔记_系统架构
- CMOS集成门电路
热门文章
- Java之IO流进阶篇:内存流,打印流,对象流
- 【Linux基础】查看硬件信息-CPU
- springMVC框架核心方法调用源码解析
- JavaScript代码组织结构良好的5个特点
- pytorch实现性别检测
- Mac下MySql初始密码设置及mysql数据库操作
- [看图说话]在VMware Workstation 9中安装Mac OS X 10.8 Mountain Lion
- BZOJ1000-1099板刷计划+一句话题解 73/100
- C# GDI+绘制一维条码打印模糊的解决办法
- Git和Gitlab在使用过程中所遇到的问题