又迟到了

A.小彩找数

直接暴力找或者存对应下表都可以。

void solve(){
    vector<int> pos(4);
    for (int i = 1;i <= 3;i ++) {
        int x;cin >> x;
        pos[x] = i;
    }
    for (int i = 1;i <= 3;i ++) cout << pos[i] << " \n"[i==3];
}

B.小彩的好字符串

考虑暴力枚举每个子串,对于每个子串相较于上一个子串一定只多了一个字符,所以根据前一个字符串统计结果继续统计即可。

void solve(){
    int n;cin >> n;
    string s;cin >> s;
    int ans = 0;
    for(int i = 0;i < n;i ++){
        int c1 = 0,c2 = 0,c3 = 0;
        for (int j = i;j < n;j ++){
            if (s[j] == '1') c1 ++;
            if (s[j] == '2') c2 ++;
            if (s[j] == '3') c3 ++;
            if (c1 == c2 && c2 == c3) ans ++;
        }
    }
    cout << ans << "\n";
}

C.小彩的字符串交换

首先,无解的情况一定是不存在 任意一个字符。

那么我们考虑是否存在子串都有 ,如果存在则为 ,否则为

void solve(){
    int n;cin >> n;
    string s;cin >> s;
    bool res = 1;
    res = res & (ranges::find(s,'1') != s.end());
    res = res & (ranges::find(s,'2') != s.end());
    res = res & (ranges::find(s,'3') != s.end());
    if (!res) return void(cout << -1 << "\n");
    for (int i = 0;i < n-2;i ++){
        int st = 0;
        for (int j = i;j < i + 3;j ++){
            if (s[j] == '1') st |= 1;
            if (s[j] == '2') st |= 2;
            if (s[j] == '3') st |= 4;
        }
        if (st == 7) {
            cout << 0 << "\n";
            return;
        }
    }
    cout << 1 << "\n";
}

D.小彩的数组选数

考虑动态规划,记录 表示第 位数字取和不取下的最大总和,每次从 项转移。那么就能在线性时间内完成求解。

void solve(){
    int n;cin >> n;
    vector<int> a(n+1);
    for (int i = 1;i <= n;i ++){
        cin >> a[i];
    }
    vector<vector<int>> dp(2,vector<int>(n+1));
    for (int i = 1;i <= n;i ++){
        dp[0][i] = max(dp[1][i-1],dp[0][i-1]);
        dp[1][i] = max(dp[0][i-1] + a[i],dp[0][i]);
    }
    cout << dp[1][n] << "\n";
}

E.小彩的数组构造

首先我们可以确认数组长度为 ,因为任何正整数都可以被 整除。

只要保证 即可有解。

提供一种构造方案,一开始全部为 ,然后给前 个数字 ,给前 个数字 ,剩下的部分只要保证不被对应数字整除即可,可以枚举对应的数字。

void solve(){
    int a,b,c;
    cin >> a >> b >> c;
    int n = a + 2;
    if (b > a || c > a){
        cout << -1 << "\n";
        return;
    }
    cout << n << '\n';
    vector<int> s(n+1,1);
    for (int i = 1;i <= b+2;i ++) s[i] *= 2;
    for (int i = 1;i <= c+2;i ++) s[i] *= 3;
    for (int i = b+3;i <= n;i ++){
        while((s[i] + s[i-1] + s[i-2])%2 == 0) s[i] += 3;
    }
    for (int i = c+3;i <= n;i ++){
        while((s[i] + s[i-1] + s[i-2])%3 == 0) s[i] += 2;
    }
    for (int i = 1;i <= n;i ++){
        cout << s[i] << " \n"[i==n];
    }
}

F.小彩的好数构造

首先长度为 是无解的,因为最多乘积为两位数。

那么剩下考虑和 乘积,这样可以保证尽可能保留原来的 ,且进位不存在或不会很多。

那么列出来的竖式,存在最后一位与第一位相加,那么就可以构造出 为偶数),

void solve(){
    int n;
    cin >> n;
    if (n == 1) return void(cout << -1 << '\n');
    for (int i = 1;i <= n;i ++) cout << "01"[i==1||i==n];
    cout << " ";
    for (int i = 1;i <= n;i ++) cout << "123"[i%2 ? 0 : 1 + (n&1)];
    cout << '\n';
}