题目大意:
你有一个数字n
每次操作你可以删除n的任意一位数
或者再最右边给它添加一位数
问你最少操作步骤让这个数为2的幂次
思路:
因为2的幂次不多
我们直接枚举2的幂次看最少操作步骤即可
枚举到long long即10的18次方
这是它最多删了一遍+1或者加到一倍的上限
AC代码:
#include <iostream>
using namespace std;
string s;
int main()
{
int t;
cin>>t;
while(t--){
cin>>s;
int ans=0x3f3f3f3f;
for(int i=0;i<61;i++){
string temp=to_string(1ll<<i);//转为字符串
int cnt=0;
for(int j=0;j<s.size();j++){
if(cnt<temp.size()&&temp[cnt]==s[j])cnt++;//如果是相同的部分
}
ans=min(ans,(int)(s.size()+temp.size()-cnt*2));//相同的部分s不用减,temp不用加
}
cout<<ans<<endl;
}
return 0;
}