zoukankan      html  css  js  c++  java
  • upc组队赛17 Bits Reverse【暴力枚举】

    Bits Reverse

    题目链接

    题目描述

    Now given two integers x and y, you can reverse every consecutive three bits in arbitrary number’s binary form (any leading zero can be taken into account) using one coin. Reversing (1,2,3) means changing it into (3,2,1).
    Could you please find a way that minimize number of coins so that x = y? If you can, just output the minimum coins you need to use.

    输入

    The first line of input file contains only one integer T (1≤T≤10000) indicating number of test cases.
    Then there are T lines followed, with each line representing one test case.
    For each case, there are two integers x, y (0≤x,y≤1018) described above.

    输出

    Please output T lines exactly.
    For each line, output Case d: (d represents the order of the test case) first. Then output the answer in the same line. If there is no way for that, print -1 instead.

    样例输入

    3
    0 3
    3 6
    6 9
    

    样例输出

    Case 1: -1
    Case 2: 1
    Case 3: 2
    
    

    提示

    Sample 1: Considering following two binary string:
    0: 0 ...0000
    3: 0 ...0011
    There is no way to achieve the goal.
    Sample 2: Considering following two binary string:
    3: 0 ...0011
    6: 0 ...0110
    You can reverse the lowest three digits in 3 so that 3 is changed into 6.
    You just need to perform one reverse so that the minimum coin you need to use is 1.

    题意

    把二进制的a 每次翻转其中三位的位置使其转换成二进制的b 需要几步操作

    题解

    先转换成二进制这是肯定的把然后把位数对齐(这很重要)
    因为每次翻转三位,所以实际上只有第一个位置和第三个位置做了调换。从后往前枚举a和b数不同的位置i,然后往前不断隔2个位置找,找到能够满足与i状态相反的的位置j,将这两个位置调换。调换需要的操作次数就是(i - j) / 2;

    代码

    #include<bits/stdc++.h>
    using namespace std;
    #define rep(i,a,n) for(int i=a;i<n;i++)
    #define scac(x) scanf("%c",&x)
    #define sca(x) scanf("%d",&x)
    #define sca2(x,y) scanf("%d%d",&x,&y)
    #define sca3(x,y,z) scanf("%d%d%d",&x,&y,&z)
    #define scl(x) scanf("%lld",&x)
    #define scl2(x,y) scanf("%lld%lld",&x,&y)
    #define scl3(x,y,z) scanf("%lld%lld%lld",&x,&y,&z)
    #define pri(x) printf("%d
    ",x)
    #define pri2(x,y) printf("%d %d
    ",x,y)
    #define pri3(x,y,z) printf("%d %d %d
    ",x,y,z)
    #define prl(x) printf("%lld
    ",x)
    #define prl2(x,y) printf("%lld %lld
    ",x,y)
    #define prl3(x,y,z) printf("%lld %lld %lld
    ",x,y,z)
    #define mst(x,y) memset(x,y,sizeof(x))
    #define ll long long
    #define LL long long
    #define pb push_back
    #define mp make_pair
    #define P pair<double,double>
    #define PLL pair<ll,ll>
    #define PI acos(1.0)
    #define eps 1e-6
    #define inf 1e17
    #define mod 1e9+7
    #define INF 0x3f3f3f3f
    #define N 1005
    const int maxn = 1000005;
    ll x,y;
    string s1,s2;
    int cnt1,cnt2;
    int kase;
    int  main()
    {
        int t;
        sca(t);
        kase = 0;
        while(t--)
        {
            s1.clear();
            s2.clear();
            scl2(x,y);
            cnt1=cnt2=0;
            while(x)
            {
                if(x%2 == 1)
                {
                  s1 += "1";
                  cnt1++;
                }
                else
                    s1+="0";
                x/=2;
            }
            while(y)
            {
                if(y%2 == 1)
                {
                  s2 += "1";
                  cnt2++;
                }
                else
                    s2+="0";
                y/=2;
            }
            printf("Case %d: ",++kase);
            if(cnt1 != cnt2 )
            {
                pri(-1);
                continue;
            }
            int len = max(s1.length(),s2.length());
            if(s1.length()<len)
            {
                int j = len - s1.length();
                rep(i,0,j)
                  s1+='0';
            }
            else if(s2.length()<len)
            {
                int j = len - s2.length();
                rep(i,0,j)
                  s2+='0';
            }
            ll ans = 0;
            int fl = 1;
            for(int i = len-1; i >= 0; i--)
            {
                if(s2[i] == '0' && s1[i] == '1')
                {
                    for(int j = i; j >=0;j-=2)
                    {
                        if(s1[j] == '0' && s2[j] == '1')
                        {
                            s2[j] = '0';
                            ans += (i-j)/2;
                            break;
                        }
                    }
                }
                else if(s1[i] == '0' && s2[i] == '1')
                {
                    for(int j = i; j >= 0;j -= 2)
                    {
                        if(s1[j] == '1' && s2[j] == '0')
                        {
                            s1[j] = '0';
                            ans += (i-j)/2;
                            break;
                        }
                    }
                }
            }
            prl(ans);
        }
        return 0;
    }
    
  • 相关阅读:
    zepto源码解读(二)——zpeto.init()——(4)$.each()函数 / likeArray函数
    zepto源码解读(二)——zpeto.init()——(3)isFunction函数
    JS小问题之—— 关于SetCapture() 和 ReleaseCapture()的用法
    zepto源码解读(二)——zpeto.init()函数——(2)zepto.fragment()函数详解
    zepto源码解读(二)——zpeto.init()函数——(1)结构整理
    JS小问题之——缓冲运动
    zepto源码解读(一)——整体架构
    jquery源码猜想(一)
    去除小括号和小括号里面的内容
    查看端口使用情况
  • 原文地址:https://www.cnblogs.com/llke/p/10815631.html
Copyright © 2011-2022 走看看