给定一个数,两种操作方法:
1、奇数时加1或减1
2、偶数时除以2
求将这个数变成1所需的最小操作数
考虑二进制。每个数都化成二进制数,如果这个数为偶数,直接右移一位;如果为奇数,判断二进制下最后三位是否是连续三个1,是就+1,不是就-1。
其实当时拿到这道题一开始想到的也是bfs,不过大家都做bfs感觉没什么意思,突发奇想想出了这个方法。不过倒是没什么信心啊,虽然感觉是对的,但没法证明,就总会觉得有问题。如果有人发现错误,或者能够证明,请务必指点一番。
#include <cstdio>
#include <iostream>
using namespace std;
int judge(int m){
int t=m,i=0;
while(t!=1){
if(t&1){
if((t>>1)&1 && (t>>2)&1) t+=1;
else t-=1;
}
else t>>=1;
i++;
}
return i;
}
int main(){
int n;
cin>>n;
while(n--){
int m;
cin>>m;
cout<<judge(m)<<endl;
}
return 0;
}