Codeforces contest 769 Div2 C:Strange Test
题目链接:
https://codeforces.com/contest/1632/problem/C
题目概述
大意就是说题目给出两个数a和b(a<b);只能通过如图中间三行所示的操作进行值的变换;每进行一次变换,算一次次数;求得使a=b而所进行的最小次数。
输入输出格式
样例
输入
5
1 3
5 8
2 5
3 19
56678 164422
输出
1
3
2
1
23329
解释
题目本身叙述很简单,意思不难理解,就是如何最短路径使得a等于b。解题关键在于我们要想清楚,每当我们采取 a=a|b 操作时,a必定大于等于b了。但这并不代表按位或操作只能在最后一步实现。因此还有个重要的点需要我们想到:先进行a++或者b++操作效率相对更高,因为你若先执行按位或的操作,你势必要进行额外的更多的b++来弥补ab差距。代码并没有什么难的地方,主要注重于这段思考。
代码(个人答案)
#include<bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
int t;cin>>t;
while(t--){
int a,b;
cin>>a>>b;
int ans=1e9;
for(int i=0;i<=b;i++)
if((i|b)==b)
ans=min(ans,abs(a-i)+(i!=b));
cout<<ans<<endl;
}
return 0;
}
值得注意的是,样例的第二个正好对应于代码的特殊情况 i=b。