本题可以用递归和递推两种方法。递归估计是最容易想到的。
- #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; - }

京公网安备 11010502036488号