本题可以用递归和递推两种方法。递归估计是最容易想到的。
- #include<bits/stdc++.h>
- #define int long long
- using namespace std;
- int n;
- int cnt=0;
- void slove2(int k){
-
for(int i=1;i<=k/2;i++){
-
cnt++;
-
slove2(i);
-
}
- }
- signed main(){
-
cin>>n;
-
slove2(n);
-
cout<<++cnt;//本身就是一个
-
return 0;
- } 暴力递归,这题数据应该很弱,也能通过。
递推的话 a[1]=1; a[2]=2=a[1]+a[1]; a[3]=2=a[2]; a[4]=4=a[3]+a[2]; a[5]=4=a[4]; a[6]=6=a[5]+a[3];
递推我们都想用前面的来表达后面的结果,然后找到一个规律,但一般都需要一个切入点来划分,比如按奇偶性,取余或除等等。 上述用奇偶可以看出:a[n]=a[n-1]+an/2 a[n]=an-1 代码如下:
- #include<bits/stdc++.h>
- #define int long long
- using namespace std;
- const int N=1024;
- int a[N]={0,1};//默认a[1]=1是已知的
- int n;
- void slove(){// 递推
-
cin>>n;
-
for(int i=2;i<=n;i++){
-
if(i%2==1) a[i]=a[i-1]; //奇
-
else a[i]=a[i-1]+a[i/2]; //偶
-
}
-
cout<<a[n];
-
return ;
- }
- }
- signed main(){
-
cin>>n;
-
slove();
-
return 0;
- }