题解:P10892 SDOI2024
yueyan_WZF · · 题解
这道题其实十分简单。
题目大意:
就是给你一个数字,当它是偶数时,就除以
做法:
样例都不过的做法:
思路:
考虑
代码:
由于连样例都不过,所以就不放代码了。
问题所在:
很明显,这样有个很大的问题,你每次将这个数变为
样例中的
正确做法:
思路:
考虑如何减小变成奇数的次数,那么我们就在每次变成奇数时,判断一下
证明:
不难发现,如果我们转换成了偶数,那么它的下一步变化成的数还是偶数,但如果你这一步转换成了奇数,那么下一步还得是奇数,所以说肯定不是最小的。
代码:
#include<bits/stdc++.h>
using namespace std;
long long ans;
long long n;
int T;
int main(){
cin>>T;
while(T--){
ans=0;
cin>>n;
while(n){
if(n%2==1){
ans++;
if(((n-1)/2)%2!=0){
n=(n+1)/2;
}
else{
n=(n-1)/2;
}
}
else{
n=n/2;
}
}
cout<<ans<<"\n";
}
}