[cf545]A-D题解
Codeforces Round #545 (Div. 2)
ps 小生不才,比赛时只做出3道。后面补了一道。
Sushi for Two
题意
给定一个只含有1或者2的数组,让你找出一个子数组,子数组要求是$n个1 和 m个2$并要求$min(n,m)$最大。
题解
暴力模拟.
ac代码
1 |
|
Circus
题意
给定$n$个人,其中每个人可能会表演小丑也可能会表演杂技演员。要求把$n$个人分成两堆。要求
- 第一队只能表演小丑,第二队只能表演杂技演员
- 第一队中小丑的个数和第二队中杂技演员的个数相等
- 两队的人数相同。
题解
暴力枚举,因为人可以分为四类。所以我们可以枚举出其中两类的分配,之后通过条件舍掉一些答案,得到正确答案。
ac代码
1 |
|
C. Skyscrapers
题意
较为简单,自己看吧。
题解
离散化+一些技巧。
因为横竖上最大值会因为中间而改变,所以答案是在
$$max(n-cnt[i],m+abs(x-y)-cnt[j])$$
中产生的。其中$cnt[i]$表示行的重复个数,$cnt[j]$表示列的重复个数。$x,y$表示在行和列中的排名。
我做的有一点烦
ac代码
1 |
|
D. Camp Schedule
题意
给定两串字符串$s,t$。要求把$s$重新排列使得$s$中的子串里,$t$出现的次数尽可能多。
题解
kmp
我们可以想象一下,如果要$s$中要有尽量多的$t$,那么首先我们在$s$的最前面是一个$t$。之后我们需要加入后续的数字,使得尽可能多的像$t$。这和kmp的思想是很相似的。就是我们在最后一个字母失配之后,我们应该跳转到的那个字母开始,继续匹配就可以匹配成一个字符串了。
举个栗子吧。
111000
101
这个例子中,我们先在$s$的前面放一个$101$。
之后我们需要配一个字母,使得尽量减少失配的字符串的长度,所以我们加入$len[next]$,也就是$0$。之后我们加入$1$形成了$10101$这样就产生了两个$t$。之后我们模拟这样子的行为就可以了。
ac代码
1 |
|