Codeforces Round #306 (Div. 2)
A. Two Substrings
给出一个字符串,如果同存在不重叠的AB和BA,输出YES,否则输出NO
先找AB再找BA,是不行的,比如BABCCCAB
还有一种方法是,先找到AB,在加一层循环,找BA
显然这样是超时的。
但我们发现,如果第一个AB,找不到对应BA,
第二个AB也找不到对应BA,那么一定是无解的。
为什么
如果第一个AB找不到BA,有可能第一个AB占掉了BA中的一位,比如ABA,
因为找不到其他BA,所以其他地方不会有BA
所以把这个AB换掉到其他位置,BA就会显现出来。
程序->11439358
B. Preparing Olympiad
给你15个数的集合,要求找一个子集,使得他们最大值最小值差大于等于x,并且所有数和在区间[l,r]中
显然从1到(1<<n)-1枚举子集就可以了。
程序->11439481
C. Divisibility by Eight
给你一个100位的数,要求去掉一些位,使得剩下的没有前导0,并且它们组成的数能被8整除。
只需要剩下3位就可以了。
枚举需要哪三位,前导0也不用管,如果有前导0就直接把它抛弃掉,仍然满足条件。
100*100*100的复杂度也不会超时
程序->11439690
D. Regular Bridge
要求你个构一个无向图,至少有一个桥,而且没有重边,每个节点的度数为k。k小于100。
当n是偶数的时候一定没有满足条件的图,输出NO
这是我猜的,事实证明也是对的。
想想怎么证明吧,
欧拉回路的充要条件:所有节点的度数均为偶数。
显然这里如果节点度数为偶数,那么一定是存在欧拉回路,
而存在欧拉回路的图一定是没有桥的,因为有经过所有边的环。
当n是奇数的时候,自行构图即可。构图是固定的套路,就不细说了。
程序->11440182
E. Brackets in Implications
给一个真值表
1 -> 1 = 1
1 -> 0 = 0
0 -> 1 = 1
0 -> 0 = 1
现在给你n(最大100000)个01字符,要求用“推导出”符号(->),配合一些括号,使得结果为0
一个分类讨论题
显然我们需要把这个长串化为 1 -> 0
前一部分为1,后一部分是0
要使后一部分结果为0,那么需要把后一部分化为 1->0
以此类推
最后化为 1 -> 1 -> ... -> 1->0
也就是说,最后一个数,一定是0才行
如果最后一个数不是0,输出NO
怎么找?
只有1->0结果是1,所以我们找所有的上升序列
比如 0 0 1 1 0 0 0 1 0 0 1 0
找出上升序列 【0 0 1 1】【0 0 0 1】【0 0 1】【0】
分成了四个部分,前边三个结果是1,后边一个结果是0
但是如果最后是多个0
如果最后的0是三个以上,比如
【0 0 0 0 0】
那么把倒数第二个和倒数第三个合并,成1
【0 0 1 0】
这样前三个结果也就是1了
如果最后只有两个0
比如 0 0 1 1 0 1 1 0 0
我们先划分
【0 0 1 1】【0 1 1】【0 0】
最后一个结果不是0,是不满足条件的。
但是如果这样
【0 0 1 1】【0 【1 1 0】】【0】
就满足条件了
第二大块中 【1 1 0】结果是0,【0【110】】就相当于【0 0】结果是1
因此,对于这种情况,我们把倒数第二个0分给前一大块,让前一大块化为 0->0,结果是1,就满足条件了。
当然,对于输入之后0 0,或者诸如 1 1 1 1 1 0 0这样的,直接输出NO,不存在
程序->11441742