专栏文章

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

B4371题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miomwonu
此快照首次捕获于
2025/12/02 21:49
3 个月前
此快照最后确认于
2025/12/02 21:49
3 个月前
查看原文

Solution

我们需要构造一个由 nn11mm00 组成的 0101 字符串,满足以下条件:
  • 所有子段的 KK 的最大值恰好为 kk,其中 KK 是子段中 00 的数量减去子段中 11 的数量。
  • 在所有满足条件的字符串中,选择字典序最小的那个。
要构造满足条件的字符串,我们需要确保贪心:
  • 字典序最小的字符串应该尽可能将 00 放在前面。
  • 为了确保所有子段的 KK 的最大值是 kk,我们需要控制 0011 的分布,避免出现某个子段的 KK 超过 kk
  • 特别地,最长的连续 00 的子段会贡献最大的 KK 值。因此,我们可以先放置 kk 个连续的 00,这样这些 00 的子段的 KK 就是 kk
  • 然后,我们需要确保其他子段的 KK 不超过 kk。可以通过交替放置 1100 来实现这一点。

构造方法:

  1. 首先放置 kk00。这样,这 kk00 的子段的 KK 就是 kk
  2. 然后,将剩余的 00111010 的形式交替放置。这样,每个 1010 对的 KK11=01 - 1 = 0,不会增加 KK 的最大值。
  3. 最后,如果还有剩余的 11,直接放在末尾。因为 11 会减少 KK,所以不会影响最大值。
代码其实很短。
AC code
CPP
#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;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...