A. You Are Given Two Binary Strings…(思维 + 规律)
原题链接:http://codeforces.com/contest/1202/problem/A
题意: 给两个二进制串 x,y,要求一个 k ,能使得 sk = f(x) + g(y) * 2^k 的二进制结果反转后字典序最小。
思路: 2^k 即是在 y 串的后面添上 k 个0,也就是左移 k 位。因为要求计算后的数字反过来的字典序最小,所以只需要尽量让最后几位变成0。先找到 y 串最后一个 1 所在的位置,再找到 x 串与 y 串右对齐后,在 x 串中,与 y 串最后一个 1 相对应的位置从左往右第一个 1 的位置,这两个 1 之间的距离就是 k 。
Code(C++):
#include <iostream>
using namespace std;
int main(){
int t; cin>>t;
while(t--){
string s1,s2;
cin>>s1>>s2;
int p1,p2;
int len1=s1.length(),len2=s2.length();
for(int i=len2-1;i>=0;i--){
if(s2[i]=='1'){
p2=i;
break;
}
}
for(int i=len1-len2+p2;i>=0;i--){
if(s1[i]=='1'){
p1=i;
break;
}
}
cout<<(len1-p1)-(len2-p2)<<endl;
}
return 0;
}
D. Print a 1337-string…(数学)
原题链接: http://codeforces.com/contest/1202/problem/D
题意: 构造一串只由 ‘1’,‘3’,‘7’ 组成的字符串,使其 ‘1337’ 子序列(不用连续)数量为 n 。
思路: 构造 ‘13337773333337’ 类型的字符串,使 C(2, m) + k = n。
其中 k 为由 7 构成的1337子序列的个数,也就是中间 ‘7’ 的数量,C(2, m) 为由 3 组成的1337子序列的个数,也就是中间 ‘3’ 的数量。
Code(C++):
#include <iostream>
using namespace std;
int main(){
int t; cin>>t;
while(t--){
int n; cin>>n;
cout<<133;
int x=1;
while(x*(x-1)/2<=n) //先确定由3组成的1337子序列的个数
x++;
x--;
for(int i=1;i<=n-x*(x-1)/2;i++) //再确定由7构成的1337子序列的个数
cout<<7;
for(int i=1;i<=x-2;i++) //一开始已经输出两个3了
cout<<3;
cout<<7<<endl;
}
return 0;
}