题解:B4371 [GXPC-S 2025] 序列 / sequence

· · 题解

Solution

我们需要构造一个由 n1m0 组成的 01 字符串,满足以下条件:

要构造满足条件的字符串,我们需要确保贪心:

构造方法:

  1. 首先放置 k0。这样,这 k0 的子段的 K 就是 k

  2. 然后,将剩余的 0110 的形式交替放置。这样,每个 10 对的 K1 - 1 = 0,不会增加 K 的最大值。

  3. 最后,如果还有剩余的 1,直接放在末尾。因为 1 会减少 K,所以不会影响最大值。

代码其实很短。

AC code

#include<bits/stdc++.h>
using namespace std;
int n,m,k;
int main()
{
    cin>>n>>m>>k;
    for(int i=1;i<=k;i++)// 第一步:输出 k 个 0
        cout<<0;
    m -= k; // 剩余的 0 的数量
    for(int i=1;i<=m;i++) // 第二步:交替输出 1 和 0,每次输出 "10",共 m 次
        cout<<10;
    n -= m; // 剩余的 1 的数量
    for(int i=1;i<=n;i++)// 第三步:输出剩余的 1
        cout<<1;
    return 0;
}