题解:P10892 SDOI2024
x1489631649 · · 题解
题目链接
分析
因为
- 当
n = 1 时,显而易见,step_1 = 1 。 - 当
n = 2 时,step_2 = step_1 。 - 当
n = 3 时,我们可以选择将n 加一或者减一,结果相同。 - 当
n = 4 时,step_4 = step_2 。 - 当
n = 5 时,step_5 可以等于step_2 + 1 或者等于step_3 + 1 。我们通过比较可以得到step_5 = step_2 + 1 的时候更小。 - 当
n = 6 时,step_6 = step_3 。
然后我们总结可得答案等于下表。
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | |
|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 1 | 2 | 1 | 2 | 2 | 2 | 1 | 2 | 2 |
显然当
可是这是一个递归做法并没有什么差异,所以我们就要继续找规律。
我们将上面得出奇数步数的表列出来。
| 1 | 3 | 5 | 7 | 9 | |
|---|---|---|---|---|---|
| 无 | 1 | 2 | 3 | 4 | |
| 无 | 2 | 3 | 4 | 5 |
然后我们就会惊奇的发现
我们从
所以我们就可以得出以下代码。
Code
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
while (t--)
{
long long n,s=0;
cin>>n;
while(n!=0)
{
if(n%2==0)
n/=2;
else{
s++;
n/=2;
if(n%2==1)
n++;
}
}
cout<<s<<endl;
}
}
时间复杂度
时间复杂度为