Codeforces Round #769 (Div. 2) B,C
B
这道题我在vp的时候一直没有想出来,一直不知道到底怎么写,只是想到和幂有关,wa了一发,后来看了大佬的题解,真是觉得自己太菜了,自愧不如
这里我还有一个误区,就是在vp的时候我一直想着把最大的n-1和1放在一起,其实是不对的,因为那时我觉得答案的max一定是n-2(我觉得n-1和1异或一定会减一,我也不知道我当时怎么想出来的,赛后自己仔细想了想,好像n-1和1异或不一定=n-2,只有当n-1是奇数的时候异或1才会减一,当时我应该是傻了吧)
#include <iostream>
using namespace std;
int n,t;
void solve()
{
cin>>n;
int mid=1;//mid是二进制中只有一个1且此时1的位置是最高位,把mid和0放在一起,那么这个一定是就是这个数,而其他的都和相邻的进行异或,那么这样
//他们的值一定不会很大,不会超过mid,对于x,和x+1,只有其中x+1是1000式二进制的时候,异或值才是x+x+1(两个值相加),
//而x+x+1一定不会等于mid,最大只能等于mid-1,其他的异或值不一定等于x+x+1哦
for (int i=1;i<=n;i<<=1)
{
if ((i<<1)>n-1)
{
mid=i;
break;
}
}
for (int i=1;i<mid;i++)
{
cout<<i<<" ";
}
cout<<0<<" ";
for (int i=mid;i<n;i++)
{
cout<<i<<" ";
}
cout<<'\n';
return ;
}
int main ()
{
cin>>t;
while (t--)
{
solve();
}
system ("pause");
return 0;
}
C
vp的时候看这道题就只有十多分钟了,脑子还是不清醒,以为总共只有两种操作方法
1,a+x(x次加法),然后在或运算,最后等于b
2,a先异或,然后再对b进行加法(因为或运算最后的值一定会大于等于max(a,b))
其实还有
3.b+x(先对b进行x次加法),然后再或
4,直接取差值
然后求取最小操作数
#include <iostream>
using namespace std;
int a,b,n;
void solve()
{
cin>>a>>b;
if (a>=b)
{
cout<<a-b<<'\n';
return ;
}
//cout<<(a|b)<<'\n';
int ans1=(a|b)-b;
ans1++;
//cout<<ans1<<" ";
int ta=a,tb=b;
int ans=0;
while ((ta|tb)!=tb)
{
ta++;
ans++;
}
ans1=min(ans1,ans+1);
int tmpb=b*2+100;
ta=a,tb=b;
ans=0;
while ((ta|tb)!=tb&&tb<tmpb)
{
tb++;
ans++;
}
ans1=min(ans1,ans+1);
ans1=min(ans1,b-a);
cout<<ans1<<'\n';
return ;
}
int main ()
{
int t;
cin>>t;
while (t--)
{
solve();
}
system ("pause");
return 0;
}
标签:769,int,Codeforces,mid,异或,solve,Div
From: https://www.cnblogs.com/righting/p/17004488.html