什么破烂场,题目根本不是Div.2难度的。算了,写个题解再说吧。
Ranklist:
A - You’re given two binary strings…
题意:有两个01字符串 a a a和 b b b,如果把每个字符串看作一个二进制数的话,都会对应一个十进制数。字符串 s s s对应的十进制数记作 f ( s ) f(s) f(s)。你要求出满足要求的非负整数 k k k,使得 f ( a ) + 2 k ∗ f ( b ) f(a)+2^k*f(b) f(a)+2k∗f(b)转化为二进制后反序的字典序尽可能小。题目包含多测。
思路:
刚上来就给你一个下马威,告诉你这不是普通的Div.2.
首先,我们知道,乘 2 2 2的 k k k次方其实就是在二进制数后面添 k k k个 0 0 0,而如果要让反序的字典序尽可能小,那么最后一位就要尽可能小,在满足这个的前提下,倒数第二位也要尽可能小,以此类推。
我们假设 b b b的后 x x x位全部都是 0 0 0,而从右往左数第 x x x位为 1 1 1。那么 k k k不论取什么值, f ( a ) + 2 k ∗ f ( b ) f(a)+2^k*f(b) f(a)+2k∗f(b)的后 x x x位永远不会发生改变,永远与 a a a的后 x x x位相同。此时,如果第 a a a的第 x x x位为 1 1 1,那么我们就不用添 0 0 0了,已经取到了最优解。而如果如果第 a a a的第 x x x位为 0 0 0,那么 f ( a ) + 2 k ∗ f ( b ) f(a)+2^k*f(b) f(a)+2k∗f(b)的第 x x x位为 1 1 1,不是我们想要的。此时我们就要在 b b b的后面添上一个 0 0 0,然后重复上述操作。
简单来说,假设 b b b最右边一个 1 1 1是从右往左数第 x x x位,那么本题要求的答案就是 a a a从右往左数第 x x x位左边有多少个连续的 0 0 0。
C o d e : Code: Code:
#include <bits/stdc++.h>
using namespace std;
int T;
string s,t;
int main(){
cin>>T;
while(T--){
cin>>s>>t;
int ind=-1;
for(int i=t.size()-1,cnt=0;i>=0;i--,cnt++){
if(t[i]=='1'){
ind=cnt;
break;
}
}
if(ind==-1){
cout<<0<<endl;
continue;
}
int ans=0;
for(int i=s.size()-ind-1;i>=0;i--){
if(s[i]=='0') ans++;
else break;
}
cout<<ans<<endl;
}
return 0;
}
B - You’re given a decimal string…
题意:给你一个由 0 0 0到 9 9 9组成的字符串。对于所有的 x = 0 , 1 , … , 9 x=0,1,\dots,9 x=0,1,…,9,