第十四届校赛初赛

代码位置:

https://github.com/HarryGuo2012/ACMCode/tree/worldLine/CDOJ/14thPr

A Graph Problem

题意

给个$n$个点的无向图,再给出$k$个要求,问最多能删除多少条边,使得每个要求的点对联通。

题解

注意到点的规模只有15,我们可以枚举集合来解决。
维护一个并查集,我们能够知道哪些点是必须在同一个连通块内的,这样要求的规模就从$n^2$降到了$n$。
令$dp[s]$表示对于要求的子集$s$,满足$s$中的每个要求需要的最少的边。这样一来,我们能够得到转移是:
$$dp[s] = \underset{u,v}{min} (dp[u] + dp[v]),u\cup v = s$$
由上面的转移,我们就只需要预处理出把每个要求子集中的点全部联通的最小解了。
祥见代码。


Bank

题意

有个神奇的售货机,有无限的纸币,并且有无限的商品,任何价格的商品都能买到。
现在要去换零钱,由于售货机的找钱机制是随机的,所以人品不好的时候是得不到我们想要的零钱的。
比如现在有40元售货机待找,我们想要一张10元的零钱,但是售货机却给了两张20的纸币。

题解

结合生活实际,这道题是非常简单的。
首先我们将这些钱分类,一个单位下的分一类,换句话说分是一类,角是一类,1元是一类,10元是一类。。
我们首先考虑类和类之间的关系,由于售货机不会将10元的钱来当1元或者2元用,所以类向上是没啥关系的,由于脸很差,所以售货机总是尝试用价值高的类来还钱,比如售货机不会用10个1块来当10块用,所以类向下是没啥关系的。
所以我们得出一个结论,类之间是独立的,那么问题就简单了,由于每个类是一样的,我们就只需要知道类里面的三个数字之间的关系就好了,这时候脑补一下就能得出结论。
接下来我们就可以枚举用多少块,然后check剩下的钱是否能够得到我们想要的零钱就好。
详见代码


Date

题意

问有多少天,日期数与星期数是一样的。

题解

很容易发现一件事情,如果要一样,1号就必须是星期1,所以就只用统计有多少个月1号是星期1。
由于四百年一个轮回。。所以只要模拟四百年内的情况就好了
过程很繁琐,要仔细写


Easy Problem

题意

题意就是那个公式啦

题解

由于用字母一定优于用子串,所以就枚举每个字母,然后统计答案就好


Find the Stuff

题意

有个人机器人从最下面那层开始从左向右消方块,问第$k$个被消掉的是哪个

题解

首先离散化,这样,问题就变成了:给个序列,然后问第一个小于$k$的前缀和的位置在哪:

对于这个问题,可以预处理前缀和,然后二分,上图中蓝色的位置就是我们二分出来的层。
由于前面我们离散化了,所以现在二分出来的答案其实是若干相同的层中的某一层的某个位置。取模后便能知道在哪一层了:

接下来就是具体在哪个位置,由于知道在哪一层了,所以其实就是解决前缀中有多少个数小于某个数的问题,这个能在树状数组上二分解决。


Good Water Problem

题意

给个集合,每次的操作可以去除两个数$x,y$,然后将他们得最大公约数和最小公倍数填回去,问最后从大到小排序后,字典序最大的解。

题解

首先,我们能够直观的得到最大的数一定是所有的数的lcm,问题就是答案中的第二个数会不会受到求解第一个数时的顺序的影响。我们首先观察一个素数的不同幂组成的序列:
$$A={p^{a_0},p^{a_1},p^{a_2},\cdots,p^{a_k}}$$
他们的lcm很明显是$p^{max(a)}$,任意$p^i$与$p^j,i\ge j$求$lcm$,答案都是$p^i$,所以$i$与比$i$小的幂求$lcm$的时候,$i$都会被保存下来。
另外由于任意$p^i$与$p^j,i\le j$求$gcd$的答案都是$p^i$,所以当$i$与比$i$打的幂求$gcd$的时候,$i$都会被保存下来。
由于答案只和当前序列中$p$的最高次幂有关系,所以综上,在$A$中第一次的顺序并不会影响第二次的答案。
并且每次操作只是消除一个$p$的最高幂。
而对于一个非素数幂的序列来说,只是若干个不同的素数幂的序列的叠加而已。
所以我们能够得到如下算法:

维护每个素数的所有的幂的个数
每次的答案就是将所有的素数的最高幂乘起来
消掉每个素数的一个最高幂

详见代码


Happy Shape

题意

给个平面的长方形和圆,求交的面积

题解

首先将圆的圆心移动到原点,然后按原点将长方形剖分为四个三角形$OAB,OCD,OAD,OBC$:

接下来我们只用计算每个三角形与圆的交的面积,对于$OBC$这种除了$O$以外有一个点在圆内的三角形。
只需要求一个扇形$OFG$的面积和一个三角形$OBF$的面积:

对于$OCD$这种除了$O$有两个点不在圆内的三角形,只需要求一个扇形的面积即可。
对于$OAB$这种全部在圆内的三角形,只需要计算整个三角形的面积。
很明显这种做法必须要求我们知道面积的正负。
逆时针沿着矩形走,如果$O$在右手边则面积是负的。


Infinity Set

题意

给$x,y$,将所有的$x,y$系数非负的线性组合排序后,问第$k$个是多少。

题解

易证明若$x,y$互素,则从$xy-x-y+1$开始,每个整数都可以被他们表示出来。
由于$xy-x-y+1$并不会太大,所以就把小于这个值的所有数都暴力出来,然后就可以了。
如果不互素,则首先除掉$gcd$,最后答案再乘回来即可。


Just a Magic String

题意

首先有个串a,每次将串取反(a变b,b变a)后接到串后面,得到一个无限长的串。
问串$X$在这个无限长的串的哪个位置首先出现。

题解

这个题暴力$KMP$就好,由于串$X$的长度是$10^6$,所以只要我们构造一个$10^7$长的串,就一定能把$X$包含进去,因为如果$10^6$的串中没有匹配到$X$,那么$X$一定跨在两个$10^6$的串上面的,由于abbabaab把所有ab的二元组包含了进去,所以最多需要$8*10^6$长的串即可。