Codeforces Round #769 (Div. 2)思路分享


Codeforces Round #769 (Div. 2)

咕的最久的一场比赛.....当时被C卡住,真的让我自闭了许久。。。

A. ABC

发现合法的方案只有01和10,其余均为不合法。

B. Roof Construction

B题当时真的卡了我许久....
由于数字时0到n-1,也就是说二进制是从0,一个一个往上加的。考虑最高的位数,将所有的数字按照最高位是0,是1分成两堆。可以发现无论怎么安排,总有两个数异或起来会使最高位的1异或出来。最以最大值最小只能是最高位为1,其他位为0.方案也简单,将两拨分开放,中间交界处放0与1<

C. Strange Test

真的没有看清楚a,b的数据范围.....一直在找什么贪心....结果卡住gg...
考虑我们使用过操作三后,一定存在a>=b,那么我们只能让b一直加1来与a相等。所以最后的结果一定是a加到某个数后,然后a|b,之后b++.或者b先加到某个数后,a|b,之后a++.因为数据大小都是1e6,所以我们直接枚举即可。

点击查看代码
#include
using namespace std;
int T,a,b;  
int main()
{
//    freopen("1.in","r",stdin);
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&a,&b);
        int ans=b-a;
        for(int i=1;i<=ans;++i)
        {
            if(((a+i-1)|b)==b)
            {
                ans=i;
                break;
            }
        }
        for(int i=1;i<=ans;++i)
        {
            if((a|(b+i-1))==b+i-1)
            {
                ans=i;
                break;
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}