cxk不会二进制 (贪心)

cxk不会二进制

Description 最近cxk迷上了二进制,他很菜,有道简单的题不会做,挂在这里求大佬做一下:

以二进制形式给出两个数字:x,y。令s = x + y * 2 ^ k。输出能使 s 倒过来字典序最小的k。例如:x = 110(2进制),
y = 11(2进制) ,当k = 0 时,s0 = x + y * 1 = 1001(2进制) ,反转rev(s0) =
1001,当k=1时,s1 = x + y * 2 = 1100,反转rev(s1) = 0011。s1 < s0 (2 ^ k 是 2
的k次方的意思,乘法、加法都是十进制下的)

字典序:比较它们的第一个字母。如果它们不同,那么第一个字母小的字符串就小于另一个字符串。如果第一个字母是相同的,然后比较第二个字母,以此类推。如果一个字符串没有更多的字母可供比较,而另一个字符串有更多的字母可供比较,那么第一个(较短的)字符串将被视为字母序小。(0<1)

例如:00 < 01 < 10 < 11.

Input 输入第一行为t,代表有t组样例(t <= 100)

每组样例包括两行:x、y。

x、y都为一个01字符串。字符串的长度<= 1e5

Output 输出t行,

每行一个数k 使得到的rev(s) 字典序最小

Sample Input 1 
5
110
11
1010
11
10001
110
1
1
1010101010101
11110000
Sample Output 1
1
1
3
0
0

思路

怎么让颠倒过来最大,,那么就要让颠倒过来之后,要让第一个 1 的位置尽可能在后面的位置。。剩下的好难叙述,自己想吧

题解

#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
const int Len = 1e6 + 5;

int main()
{
    ios::sync_with_stdio(false); cin.tie(0);
    //freopen("T.txt","r",stdin);
    int t;
    cin >> t;
    string a,b;
    while(t --)
    {
        cin >> a >> b;
        int back_0 = 0;
        for(int i = b.size() - 1; i >= 0; i --)
            if(b[i] == '0')
                back_0 ++;
            else
                break;
        int ans = 0;
        for(int i = a.size() - 1 - back_0; i >= 0; i --)
        {
            if(a[i] == '0')
                ans ++;
            else
                break;
        }
        cout << ans << endl;
    }

    return 0;
}
发布了119 篇原创文章 · 获赞 186 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_34261446/article/details/104521103