C.Strange Test—贪心+位运算
题解:
首先我们要知道,a|b必然是大于等于b的,用过操作三之后只能进行操作二,因此操作三只能用一次,所以这道题就转化为a++,b++,两个数加到某个值时使a|b=b
,找到操作步数最少的值即为答案
这题思考出来不难,不熟悉位运算还真不好敲代码
位运算
#include <iostream>
using namespace std;
signed main()
{
int T;
int a,b;
cin>>T;
while(T--)
{
scanf("%d %d",&a,&b);
int res=1e6+2;
res=b-a;
for(int i=a;i<=b;i++)
{
int x=b;
for(int j=20;j>=0;j--)
{
//找到第一个a|b==b的b值
if(i>>j&1)
{
if(~x>>j&1)
{
x|=1<<j;
x&=~((1<<j)-1);
}
}
}
res=min(res,i-a+1+x-b);
}
cout<<res<<endl;
}
}
acwing周赛 两种操作
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n,m;
int res=0;
signed main()
{
cin>>n>>m;
while(m>n)
{
if(m&1)res++;
m=(m+1)/2;
res++;
}
res+=n-m;
cout<<res<<endl;
}