[考试]20151009
1、前言
后来做了一遍觉得今天题目200还是很轻松的吧,数据感觉比较水。为什么说后来做,因为考试的时候快2个多小时了结果突然系统报错然后什么修改都没了,然后直接弃考了。这是不是也要算个问题?
2、Child 幼儿园
大概题意:给出一个长度为n的带权环,要求从中某处切开,顺时针平铺形成一个数组,通过最少的次数进行相邻数与数之间的交换,使最后形成{1,2,3,...,n}。
题解:
做过火柴排队就应该很快想到求逆序对个数了,不用逆序对是没有任何办法的。逆序对无论你用O(n^2)还是O(n log n)(树状数组求逆序对介绍:http://www.cnblogs.com/jinkun113/p/4725420.html),在这里都能过。问题就在于,这是一个环,如何切割才是最好的呢?显然我们不能每次选一个位置去切,这样时间复杂度高达O(n^2 log n),而这里n<=10000。我们假设这不是个环,然后每次进行平移,注意到最后形成{p1,p2,p3,...,pn}或是{p2,p3,p4,...,p1},之间是有联系的。设最初逆序对个数为x,第一位为a,每次的平移相当于将第一位移动到最后一位,其他数我们将他们分成两部分——比a大的和比a小的。由于这个环上的数是1到n的排列,所以易得比a大的个数为n-a,比a小的个数为a-1。则逆序对在原基础上需要减去a-1,加上n-a,即nx=x-2*a+1。这样,只需要用O(n)的时间就算出来最小值了。
3、Color 棋盘染色
大概题意:一个N*N的棋盘,被挖去了某些格子,要求用最少的颜色给剩下的格子染色,使得任意两个在同行或同列的格子的颜色不同。
总结:其实求出颜色的个数还是简单的,但是题目还要求把棋盘输出,这就麻烦了,我并不会,自行看题解。
题解(from 出题人):
建立二分图, 如果第i行第j列的位置有格子,则在xi到yj之间连一条边,所以一个格子对应一条边,对于任意两个颜色相同的格子,(i1,j1)和(i2,j2),都有i1<>i2且j1<>j2,所以这两个格子所对应的边无公共顶点,所以颜色相同的格子所对应的边的集合是一个匹配,现在问题就转化为了如何用最少的匹配覆盖掉二分图中所有的边.很容易想到一个贪心法那就是每次选随便找一个最大匹配,然后删掉上面的边然后继续,然而这样是有反例的。
关键问题就是第一次的时候你的最大匹配没有匹配到度最大的顶点x1,因为设二分图度最大的顶点的度为maxd,则至少要maxd个匹配才能覆盖掉二分图中所有的边.实际上有一个定理:二分图一定存在一个匹配饱和所有度最大的顶点的匹配,该定理的证明在一般图论书上有详细介绍,而由于问题的下界是maxd,所以只要每次取饱和所有度最大顶点的匹配就可以了,具体实现方法与一般的求最大匹配的方法是一样的,你只要优选从度最大的顶点开始找增广路就可以了,一但某个度最大的点成为饱和点,它就不可能成为非饱和点了。
4、奶牛编号
大概题意:求有多少个长度为n,值域为[1,n]的数列a,满足a[i]<a[i+2] && a[i]<a[i+3]。仅需方案数后五位。
总结:虽然看起来很好做的样子,但是要考虑的东西很多。
题解(from 出题人):
设f(h, min)表示这样的数列的总数:
1、数列长度为h。令数列的元素为a1, a2, …, ah。
2、a1, a2≥min
3、对于任意的1≤i≤h-2,有ai<ai+2
4、对于任意的1≤i≤h-3,有ai<ai+3
分三类讨论:(这里假设n足够大)
第一类:a1, a2≥min+1。
这时的总数是f(h, min+1)
第二类:a2 = min, a1≥min。
可以把a3, a4, …, ah看作一个长度为h-2的新数列。必须满足:
1、a3, a4>a1
2、a4, a5>a2
3、对于任意的3≤i≤h-2,有ai<ai+2
4、对于任意的3≤i≤h-3,有ai<ai+3
根据(1)、(3)和(4)可以得到:
a5>a3>a1≥a2
a4>a1≥a2
因此(2)可以根据(1), (3), (5)推得。故而可以化简为:
1、a3, a4>a1
2、对于任意的3≤i≤h-2,有ai<ai+2
3、对于任意的3≤i≤h-3,有ai<ai+3
这样的数列有f(h-2, a1+1)个。
因此第二类情况中共有f(h-2,k+1)(k∈[min,n])个符合f(h,min)定义的数列。
第三类:a2>min,a1=min。
必有a2>a1。将a2, a3, …, ah 看作一个长度为h-1 的数列。必须满足:
1、a2, a3, a4>a1
2、对于任意的2≤i≤h-2,有ai<ai+2
3、对于任意的2≤i≤h-3,有ai<ai+3
根据(2), (3)有:
a4 > a2 > a1
于是(1)可化简为:a2, a3 > a1,综合起来就是:
1、a2, a3>a1
2、对于任意的2≤i≤h-2,有ai<ai+2
3、对于任意的2≤i≤h-3,有ai<ai+3
这样的数列有f(h-1,a1+1)=f(h-1,min+1)个。
综合上述三类情况:
f(h,min)=f(h,min+1)+f(h-1,min+1)+f(h-2,k+1)(k∈[min,n])
时间复杂度为O(n2),空间复杂度是O(n)。输出f(n,1)即可。
5、入侵计划
大概题意:给出一个数列{1,2,...,n},给出一个变换矩阵a[n][p],在第k次变换中,原本在数列第i位的数转移到f[i][k%p],求多少次变换可以使其复原为{1,2,...,n}。
总结:出题人还是很良心,二十多行的暴力转移可以得60分(30-50分我也不知道是怎么得的除非正解写挂)。还有更神奇的骗分大法,其实我也曾这么想过:假定对于每一个位置是肯定存在循环节的,每次对某个位置进行搜索,如果搜到重复数字,则说明有循环节,记录总个数,最后求出每个位置总个数的最小公倍数即可。听上去很有道理的样子,但是其实很容易找到最开始一部分不参与循环节的情况,也就意味着你可能根本找不对循环节,但是神一般的数据让这种骗分方式给AC了。。。
题解:这其实是一道很高深的题目,主体为置换群的乘法。暂时没有打算做一个专题,在这里简要解释一下。
这是最基础的置换群问题了,所以看了之后还是感觉很容易理解。