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

posted @ 2015-06-05 16:08  zhyfzy  阅读(344)  评论(0编辑  收藏  举报