题目传送门
博客食用更佳
做法:
若 n n n 是偶数,就将 n ÷ 2 n\div2 n÷2,没有什么可纠结的。
若 n n n 是奇数,我们就要选择 n − 1 2 \dfrac{n-1}{2} 2n−1 和 n + 1 2 \dfrac{n+1}{2} 2n+1 哪个更优。
既然要纠结次数最小,也就是奇数尽量的少,那就将 n n n 处于奇数是全部减为偶数,这样纠结次数就会变少。
十年OI一场空,不开long long见祖宗!
#include<bits/stdc++.h>
#define int long long//不开long long见祖宗
#define qwq return 0
using namespace std;
signed main(){
int t;
cin>>t;
while(t--){
int n;
cin>>n;
int cnt=0;
while(n>0){
if(n%2==0){
n/=2;
}//如果n是偶数,直接除以2
else{
cnt++;//如果n是奇数,计数器加1
if((n-(n-1)/2)%2==0){
n=(n-(n-1)/2);
}//比较(n-(n-1)/2)和(n-(n+1)/2)哪个更优
else{
n=(n-(n+1)/2);
}
}
}
cout<<cnt<<endl;
}
qwq ;//完美收官qwq
}
管理大大求过!