NOIP2007提高组 解题报告
少说多做- -||
1.统计数字
nlogn排序+n统计,水过1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|
2.字符串的展开
模拟题,没什么好说的,跟着题目做就是了。不一定越长的代码一次AC的几率越高,简短一点的说不定更容易一次AC,比如我这次就一次AC了。初中的时候每次做都交了n次才过。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|
3.矩阵取数游戏
题目可以这么考虑:针对每一行单独处理,每一次只能取走行头或者行尾;如此分别处理这n行即可。 考虑第i行,f[l,r]表示取走区间[l,r]的最大值。那么显然f[l,r]只能够从f[l+1,r]+a[i,l]和f[l,r-1]+a[i,r]中去一个最大值。做一次复杂度为m^2,因此总的复杂度为O(n m^2)。 注意答案需要用高精。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
|
4.树网的核
介绍一个简单的方法: 可以用n3的时间,用floyd求出任两点间的距离d[i,j](或者使用SPFA,这样复杂度大约可以降到n2)。此时可以用n2的时间遍历d[st,ed],找出树的直径长度(或者两遍DFS找直径,复杂度2n)。然后枚举直径st->ed上的路径i->j,也就是枚举核(时间n2),之后求Ecc(i->j)(复杂度1)。 对于直径st->ed上的核i->j(注意,前提是核),Ecc(i->j)=max(min(dist[st,i],dist[st,j]),min(dist[i,ed],dist[j,ed]))。之所以只考虑四个数,是因为i(j)到st(ed)的距离大于其他任何点,如果不是这样的话那么st->ed就不是直径了。 另外,可以证明只需要考虑一条直径上的最优核偏心距(至于怎么证明真的不知道),因此考虑一条直径即可。 总的复杂度=O(n3+n2+n2)=O(n3)。如果使用SPFA,那么大约可以降到O(n^2)。对于n<=300轻松过。
进一步研究可以参照: http://tieba.baidu.com/f?kz=842504583 O(n)算法:http://www.cnblogs.com/yymore/archive/2011/07/01/2095962.html1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
|