2 条题解

  • 0
    @ 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;
    }

  • 0
    @ 2021-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
上传者