文章目录
洛谷新手村 第六回合:
P1028 数的计算
题目描述
我们要求找出具有下列性质数的个数(包含输入的自然数n):
先输入一个自然数n(n≤1000),然后对此自然数按照如下方法进行处理:
不作任何处理;
在它的左边加上一个自然数,但该自然数不能超过原数的一半;
加上数后,继续按此规则进行处理,直到不能再加自然数为止.
输入输出格式
输入格式:
11个自然数nn(n \le 1000n≤1000)
输出格式:
11个整数,表示具有该性质数的个数。
输入输出样例
输入样例#1:
6
输出样例#1:
6
说明
满足条件的数为
6,16,26,126,36,136
看这个系列的标题,二话不说坑定是递归解决一切问题啊! 很符合我的大力出奇迹的风格!
个人喜欢用万能头文件,而且洛谷能ac!
#include<bits/stdc++.h>
using namespace std;
int n, cnt = 1;
void func(int x){
for (int i = 1; i <= x / 2; i++){
cnt++;
func(i);
}
}
int main(){
scanf("%d", &n);
func(n);
printf("%d\n", cnt);
}
让后,很显然,就没有然后了…
很显然,这个递归,当n=500时已经到了一个很恐怖的数量,所以自觉告诉我,不能这么做了!
老方法不能暴力,就花式解决问题!
不说多了,直接开始:
我们以4为例子来进行说明
4后面可以跟上1,2组成14,24
14后面跟不了,24可以跟上1组成124
再加上4本身就可以得到4的种类
即 14,24,124,4
而我们只要算出1,2的种类就可以加起来得到4的种类
**因此,我们得到
f[1]=1
f[2]=2=f[1]+1
f[3]=2=f[1]+1
f[4]=4=f[1]+f[2]+1
f[5]=4=f[1]+f[2]+1
以此类推:
#include<bits/stdc++.h>//万能头文件
using namespace std;
int n;
int f[1001];//存每一位数的种类
int main(){
cin >> n;
for (int i = 1; i <= n; i++){ //1-n的递推
for (int j = 1; j <= i / 2; j++){
f[i] += f[j]; //每一位叠加,递推走起
}
f[i]++; //加上本身
}
cout << f[n];//输出n的种类
return 0;
}
那就没什么好说的了,果断,ac!
那么此题,over!