专栏文章
题解:B4371 [GXPC-S 2025] 序列 / sequence
B4371题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miomwonu
- 此快照首次捕获于
- 2025/12/02 21:49 3 个月前
- 此快照最后确认于
- 2025/12/02 21:49 3 个月前
Solution
我们需要构造一个由 个 和 个 组成的 字符串,满足以下条件:
-
所有子段的 的最大值恰好为 ,其中 是子段中 的数量减去子段中 的数量。
-
在所有满足条件的字符串中,选择字典序最小的那个。
要构造满足条件的字符串,我们需要确保贪心:
-
字典序最小的字符串应该尽可能将 放在前面。
-
为了确保所有子段的 的最大值是 ,我们需要控制 和 的分布,避免出现某个子段的 超过 。
-
特别地,最长的连续 的子段会贡献最大的 值。因此,我们可以先放置 个连续的 ,这样这些 的子段的 就是 。
-
然后,我们需要确保其他子段的 不超过 。可以通过交替放置 和 来实现这一点。
构造方法:
-
首先放置 个 。这样,这 个 的子段的 就是 。
-
然后,将剩余的 和 以 的形式交替放置。这样,每个 对的 是 ,不会增加 的最大值。
-
最后,如果还有剩余的 ,直接放在末尾。因为 会减少 ,所以不会影响最大值。
代码其实很短。
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 条评论,欢迎与作者交流。
正在加载评论...