本题可以用递归和递推两种方法。递归估计是最容易想到的。

  1. #include<bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4. int n;
  5. int cnt=0;
  6. void slove2(int k){
  7. for(int i=1;i<=k/2;i++){
    
  8.     cnt++;
    
  9.     slove2(i);
    
  10. }      
    
  11. }
  12. signed main(){
  13. cin>>n;
    
  14. slove2(n);
    
  15. cout<<++cnt;//本身就是一个
    
  16. return 0;
    
  17. } 暴力递归,这题数据应该很弱,也能通过。

递推的话 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 代码如下:

  1. #include<bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4. const int N=1024;
  5. int a[N]={0,1};//默认a[1]=1是已知的
  6. int n;
  7. void slove(){// 递推
  8. cin>>n;
    
  9. for(int i=2;i<=n;i++){    
    
  10.     if(i%2==1) a[i]=a[i-1]; //奇
    
  11.     else a[i]=a[i-1]+a[i/2]; //偶
    
  12. }
    
  13. cout<<a[n];
    
  14. return ;
    
  15. }
  16. }
  17. signed main(){
  18. cin>>n;
    
  19. slove();
    
  20. return 0;
    
  21. }