【4.3】Codeforces 刷题

本文探讨了几种字符串操作的算法问题,包括保持1的最远距离、01序列的排列、完全错位排列和最小字典序拆分。通过AC代码展示了如何解决这些问题,并提供了思路分析。此外,还涉及到了字符串的字典序性质和优化策略。
摘要由CSDN通过智能技术生成

C. Social Distance

题意:给定 01 串,问最多插入多少个 1 使得该串不破坏任意两个 1 距离至少 k 的性质。

思路:记录每个点右边的 1 的位置,再从左往右跑顺便记录左边 1 的位置即可。

AC代码:https://codeforces.com/contest/1367/submission/152473037


C. Team

题意:给定0的个数和1的个数。要求排列这些 01 使得:没有两个连续的 0,且没有两个连续的 1 。如果无解则输出-1。

思路:对于一定数量的 1 ,我们让 0 尽量少,形式如 11011011011…;我们让 0 尽量多,形式如 0101010101…。即可判断解的存在性。存在解构造即可。

AC代码:https://codeforces.com/contest/401/submission/152479413


C. Omkar and Baseball

题意:有 n 个数 1~n ,你可以选择一个区间使其变化任意位置,但是在这个区间内所有数必须换位置,现要求所有数回到自己位置问最少几次操作数 。

思路:先从终点研究,如果对升序排列的 [1,n] 操作一次,那么排列必然是完全错位的。如果选择某个子区间操作,那么子区间排列是完全错位的,两端元素位于原位。
我们知道,可以通过至多一次操作使得 [1,n] 排列完全错位,那么可以再操作一次使得排列升序,那么答案的上限就是 2 。
剔除两端位于原位的元素,对中间这个区间操作:判断是否完全错位,是则操作 1 次,否则操作 2 次(完全错位然后恢复升序)。

AC代码:https://codeforces.com/contest/1372/submission/152480447


C. Phoenix and Distribution

题意:将长度为 n n n 的无序字符串拆分为 k k k 个非空子序列( k ≤ n k≤n kn),使得最大字典序最小。

题解:#638 (Div. 2)C. Phoenix and Distribution(分类讨论)

思路:首先了解一下字符分配的字符串的字典序性质:给你一个可重字符集合,问拆分成若干个字符串的最大字典序最小是什么。如果字符集合只有一种字符,那么均摊为长度为 1 的字符串最优,因为把任意两个字符拼起来都会使最大字典序变大。如果字符集合有至少两种字符,那么拼接为一个升序字符串最优,因为对于升序字符串,如果在某位置插入和左边或右边相同的字符,那么字典序会变小。

举几个例子:

  1. ‘aaaa’,拆分成 {‘aaa’, ‘a’},如果把 ‘a’ 插入,那么 ‘aaa’ -> ‘aaaa’ 字典序会变大。
  2. ‘aaabb’, 拆分成 {‘aabb’, ‘a’},如果把 ‘a’ 插入,那么 ‘aabb’ -> ‘aaabb’ 字典序会变小。

那么这一题,首先从小到大均摊 k 个字符,如果 k 个字符不一样,那么最后一个字符就是答案,因为剩下的字符可以放到前面的字符串上。如果都一样,那么就转化成了字符分配的字符串的字典序问题了。

AC代码:https://codeforces.com/contest/1348/submission/152576547


F. Spy-string

水题,略。

AC代码:https://codeforces.com/contest/1360/submission/152570946

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值