10.20 考试总结
排列
打表找规律,考试的时候主要是题目意思没有理解。实际上就是全排列后找\[{A_i} >= i\]满足的这个的个数
然后大法师挂一阵子机以后 找规律就会发现一个神奇的递推式:$ F[i][j] = f[i - 1][j] * (j + 1) + F[i - 1][j - 1] * (i - j)$
然后就做出来了
速度限制
这个考试的时候......真的没怎么敲过用结构体的dijkstra......所以一直再调试.....其实大概也想到差不多了。就是可能速度也要另开一维可能确实一下子想不到。说不定最短路的模板敲出来了就能发现了呢? 因为....好像是每一个阶段的速度都有可能不一样,就相当于到达当前的路口时会有很多种速度,正好通往下一个路口又不限速,就会产生不同的值。
解决了这个就好办了....至于输出可以递归处理......(新学到的)储存当前值情况下的上一个值...相当于连接了起来
pr[y][v] = x.x;
ps[y][v] = x.v;
void print(int x,int y)
{
if(x != 1) print(pr[x][y], ps[x][y]);
printf("%d ", x-1);
}
棋盘染色
本来是紫题难度?但是少了一部分特别难度部分就降到了黄题??
正解应该是是二分图,找入度最大的,连一条边就--.....就是相当于染色。删减后的就相当于直接找度最大的就行。
然后就是横竖扫一遍找最大值就好了【滑稽】
建立二分图, 如果第i行第j列的位置有格子,则在xi到yj之间连一条边,所以一个格子对应一条边,对于任意两个颜色相同
的格子,(i1,j1)和(i2,j2),都有i1<>i2且j1<>j2,所以这两个格子所对应的边无公共顶点,所以颜色相同的格子所对应的边的
集合是一个匹配,现在问题就转化为了如何用最少的匹配覆盖掉二分图中所有的边.很容易想到一个贪心法那就是每次
选随便找一个最大匹配,然后删掉上面的边然后继续,这样是有反例的:
比如上图,最大匹配为3,但不只一个,如果首先选(x2,y1),(x3,y2),(x4,y3)作为最大匹配的话,后面还需3次匹配,但如果选
(x1,y1),(x3,y2),(x4,y3)做为匹配的话,后面就只需2次了
关键问题就是第一次的时候你的最大匹配没有匹配到度最大的顶点x1,因为设二分图度最大的顶点的度为maxd,则至少
要maxd个匹配才能覆盖掉二分图中所有的边.实际上有一个定理:二分图一定存在一个匹配饱和所有度最大的顶点的匹
配,该定理的证明在一般图论书上有详细介绍,而由于问题的下界是maxd,所以只要每次取饱和所有度最大顶点的匹配就
可以了,具体实现方法与一般的求最大匹配的方法是一样的,你只要优选从度最大的顶点开始找增广路就可以了,一但某
个度最大的点成为饱和点,它就不可能成为非饱和点了