D. Make a Power of Two 链接: link.
题意: 找出将数字转换为 2 的任意幂的最小移动次数。 题解: 先将2的
x
x
x次幂的结果以字符串形式保存,输入字符串
n
n
n后,因为存在最后化为2的0次幂的情况,所以需要考虑移动添加形成1的情况,此时
a
n
s
=
字
符
串
长
度
+
1
ans=字符串长度+1
ans=字符串长度+1,在将所有字符串一一对比求出移动最小值(
∣
a
∣
?
|a|?
∣a∣?共有数字
+
∣
b
∣
?
+ |b|?
+∣b∣?共有数字,即为需要删除和添加个数)。
#include<bits/stdc++.h>
using namespace std;
const long long N=1e18;
vector<string>s;
int slove(string a,string b)
{
int aa=a.length();
int bb=b.length();
int cnt=0,x=0,y=0;
while(x<aa&&y<bb)
{
if(a[x]==b[y])
{
cnt++;
y++;
}
x++;
}
return aa+bb-2*cnt;
}
int main()
{
for(long long i=1;i<=N;i=i*2)
{
s.push_back(to_string(i));
}
int t;
cin>>t;
while(t--)
{
string n;
cin>>n;
int ans=n.length()+1;
for(auto i:s)
{
ans=min(ans,slove(n,i));
}
cout<<ans<<endl;
}
}
|