3 条题解

  • 0
    @ 2025-2-24 19:19:39

    史上最短的代码,求点赞

    Code

    #include<bits/stdc++.h>
    using namespace std;
    long long a,b,minn=1e9;
    int main(){
    	cin>>a>>b;
    	for(int i=0;i<31;i++){
    		minn=min(minn,i+1+abs(a-b));
    		a*=2;
    	}
    	cout<<minn-1;
    	return 0;
    }
    
  • 0
    @ 2025-1-14 15:48:09

    题意

    题目传送门:

    洛谷 \ 梦熊

    题目说的非常清楚,就不再进行解释了。

    思路

    首先分三种情况:a<b,a>b,a=ba<b,a>b,a=b

    1. a<ba<b

      先将 aa 一直 ×2\times 2,直到 ×2\times 2>b>b 时停止,记下次数 cntcnt。然后有两种情况:

      • cnt+(ba)cnt+(b-a)aa 没有超过 bb,让 bb 减到 aa
      • cnt+1+(a2b)cnt+1+(a*2-b)aa 再一次 ×2\times 2,超过 bb,让 bb 加到 aa
    2. a>ba>b

      bb 一直加到 aa

    3. a=ba=b

      直接输出 00。(或者分为 a>ba>b 这类)

    思路就是这样,然后就分类处理就行了。

    Code

    下面是我的赛时代码:

    #include <iostream>
    using namespace std;
    
    int main()
    {
    	long long a, b;
    	cin >> a >> b;
    	long long cnt = 0;
    	if(a < b)
    	{
    		while(a*2 <= b) cnt++, a *= 2;
    		cout << min(cnt+(b-a), cnt+1+(a*2-b)) << endl;
    	}
    	else cout << (a-b) << endl;
    	return 0;
    }
    
    • -2
      @ 2025-2-15 20:25:44

      MX-X7—T1题解

      解题方法

      a可以×2(无线)

      b可以+1或-1(微调)

      所以要在最短步骤内让a=b,就要让b=最近的a*(2的次方(包括0次方))

      Code

      #include <bits/stdc++.h>
      
      using namespace std;
      
      long long a,b,ans=999999999,i=1;
      
      int main(){
      	cin>>a>>b;
      	ans=min(abs(b-a),abs(2*a-b)+1);
      	for(long long x=0;pow(2,x-1)*a<=b;x++){
      		ans=min(abs((i*a)-b)+x,ans);
      		i=i*2;
      	}
      	cout<<ans;
      	return 0;
      }
      
      • 1

      信息

      ID
      102
      时间
      3000ms
      内存
      512MiB
      难度
      2
      标签
      递交数
      757
      已通过
      151
      上传者