LFYZ-OJ ID: 1026 数的计数(数的计算)NOIP2001
数的计算(数的计数)
题目描述
我们要求找出具有下列性质数的个数(包含输入的自然数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;
}
LFYZ-OJ ID: 1026 数的计数(数的计算)NOIP2001的更多相关文章
- ACM——数的计数
http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1050 数的计数 时间限制(普通/Jav ...
- 【BZOJ 1026】 [SCOI2009]windy数
[题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1026 [题意] [题解] 数位Dp 设f[i][j]表示长度为i,第一位(也就是最高位 ...
- 数的计数(number)
数的计数(number) 题目描述 我们要求找出具有下列性质数的个数(包含输入的自然数n),先输入一个自然数n(n≤1000),然后对此自然数按照如下方法进行处理: (1)不作任何处理: (2)在它的 ...
- 九度OJ 1060:完数VS盈数 (数字特性)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5590 解决:2093 题目描述: 一个数如果恰好等于它的各因子(该数本身除外)子和,如:6=3+2+1.则称其为"完数" ...
- 九度oj 题目1060:完数VS盈数
题目1060:完数VS盈数 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6461 解决:2426 题目描述: 一个数如果恰好等于它的各因子(该数本身除外)子和,如:6=3+2+1.则称其 ...
- 【集训笔记】【大数模板】特殊的数 【Catalan数】【HDOJ1133【HDOJ1134【HDOJ1130
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3324 http://blog.csdn.net/xymscau/artic ...
- hive优化之——控制hive任务中的map数和reduce数
一. 控制hive任务中的map数: 1. 通常情况下,作业会通过input的目录产生一个或者多个map任务.主要的决定因素有: input的文件总个数,input的文件大小,集群设置的文 ...
- centos系统查看系统版本、内核版本、系统位数、cpu个数、核心数、线程数
centos查看系统版本 cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) 1)查看centos内核的版本: [root@loc ...
- Android 简单统计文本文件字符数、单词数、行数Demo
做的demo是统计文本文件的字符数.单词数.行数的,首先呢,我们必须要有一个文本文件.所以我们要么创建一个文本文件,并保存,然后再解析:要么就提前把文本文件先放到模拟器上,然后检索到文本名再进行解析. ...
随机推荐
- HybridStart混合应用开发框架
转自我的博客,原文地址:http://refined-x.com/2017/06/26/%E5%9F%BA%E4%BA%8EAPICloud%E7%9A%84%E6%B7%B7%E5%90%88%E5 ...
- HBase实践案例:知乎 AI 用户模型服务性能优化实践
用户模型简介 知乎 AI 用户模型服务于知乎两亿多用户,主要为首页.推荐.广告.知识服务.想法.关注页等业务场景提供数据和服务, 例如首页个性化 Feed 的召回和排序.相关回答等用到的用户长期兴趣特 ...
- Docker 镜像仓库
仓库 仓库(Repository)是集中存放镜像的地方. 一个容易混淆的概念是注册服务器(Registry).实际上注册服务器是管理仓库的具体服务器,每个服务器上可以有多个仓库,而每个仓库下面有多个镜 ...
- 问题记录2019-03-06(todo)
RuntimeError: maximum recursion depth exceeded while calling a Python object
- UUID简记
一.概述 wiki上的解释: A universally unique identifier (UUID) is a 128-bit number used to identify informati ...
- Linux内存管理 (3)内核内存的布局图
专题:Linux内存管理专题 关键词:内核内存布局图.lowmem线性映射区.kernel image.ZONE_NORMAL.ZONE_HIGHMEM.swapper_pg_dir.fixmap.v ...
- 【转】localStorage使用总结
原文地址:https://www.cnblogs.com/st-leslie/p/5617130.html 一.什么是localStorage.sessionStorage 在HTML5中,新加入了一 ...
- ASP.NET Core使用HttpClient的同步和异步请求
using System; using System.Collections.Generic; using System.Collections.Specialized; using System.I ...
- Java 208 道面试题:第一模块答案
目前市面上的面试题存在两大问题:第一,题目太旧好久没有更新了,还都停留在 2010 年之前的状态:第二,近几年 JDK 更新和发布都很快,Java 的用法也变了不少,加上 Java 技术栈也加入了很多 ...
- Day3 Numerical simulation of optical wave propagation之标量衍射理论基本原理(三)
3.标量衍射理论 光源通常不是简单地平面.球面或高斯光束波.对于更一般的情况,必须使用更老练的方法来求解标量赫姆霍兹方程,需要利用格林定理并灵活使用边界条件. 基本问题:给定源平面光场U(x1,y1) ...