Educational Codeforces Round 70 (Rated for Div. 2)

文章目录

  • A. You Are Given Two Binary Strings...(思维 + 规律)
  • D. Print a 1337-string...(数学)


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 
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 
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;
}


你可能感兴趣的:(Educational Codeforces Round 70 (Rated for Div. 2))