2 条题解
-
0齐硕 LV 10 @ 2022-07-29 15:30:37
//枚举法
#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
ll a,b,ans=1e18;
int now;
ll solve()
{
if(a>b)return a-b;
bitset<64> bit(b-a);
ll res=0,tmp=1;
for(int i=0;i<now;i++) res+=bit[i]*tmp;
for(int i=now;i<64;i++)res+=bit[i]*tmp,tmp*=2;
return res;
}
int main()
{
cin>>a>>b;if(a>b)swap(a,b);
for(now=0;a<=b*2;now++,a*=2)ans=min(ans,solve()+now);
cout<<ans<<endl;
} -
02021-04-18 16:31:57@
D 黑板上的数(2) 题解。
考虑枚举对较小数施以乘法的次数,其余操作是加法。
如果我们在x次乘法前,使用一次"+1",则其效用变化为"+2^x"。这样看来,我们可以枚举乘法次数,定义两个数在"乘法次数=now"意义下的"距离"——使它们相等需要的最少加法次数。
考虑位操作。如果求a“进行now次乘法的前提下,变为b所需的最少次数”,则将b-a化为二进制。第now位之前,每位只需要一次。之后分别需要1,2,4,...次。
取最小值即可。
Code:#include<bits/stdc++.h> using namespace std; typedef long long int ll; ll a,b,ans=1e18; int now; ll solve() { if(a>b)return a-b; bitset<64> bit(b-a); ll res=0,tmp=1; for(int i=0;i<now;i++) res+=bit[i]*tmp; for(int i=now;i<64;i++)res+=bit[i]*tmp,tmp*=2; return res; } int main() { cin>>a>>b;if(a>b)swap(a,b); for(now=0;a<=b*2;now++,a*=2)ans=min(ans,solve()+now); cout<<ans<<endl; }
- 1
信息
- ID
- 1239
- 难度
- 9
- 分类
- (无)
- 标签
- 递交数
- 10
- 已通过
- 6
- 通过率
- 60%
- 被复制
- 4
- 上传者