T1.统计数字

  给出n个数,统计每个数字出现的个数。

  n小,快排解决。

T2.字符串的展开

  给出一个字符串,其中形如 d-h,4-9之类的就展开,(前面比后面小的保留,相等也是),三个参数,P1表示大小写,1为小,2为大,3为*,P2重复个数,P3正序倒序,1正。

  模拟展开即可

T3.矩阵取数游戏

  m*n的矩阵,每次从每行取一个数,且只能从行首和行尾取,每个数的分数是 数的值*(2^k),k=第k次取数。

  由于每行互不影响,我们可以分别对每行进行分析,dp[i][j] = max{dp[i+1][j]+a[i]*2^x, dp[i][j-1]+a[j]*2^x};

  但是考虑到x可能较大,所以要用高精度。

T4.树网的核

  设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边带有正整数的权,我们称T为树网(treenetwork),其中V, E分别表示结点与边的集合,W表示各边长度的集合,并设T有n个结点。

  路径:树网中任何两结点a,b都存在唯一的一条简单路径,用d(a,b)表示以a,b为端点的路径的长度,它是该路径上各边长度之和。我们称d(a,b)为a,b两结点间的距离。

  一点v到一条路径P的距离为该点与P上的最近的结点的距离:

    d(v, P)=min{d(v, u),u为路径P上的结点}。

  树网的直径:树网中最长的路径称为树网的直径。对于给定的树网T,直径不一定是唯一的,但可以证明:各直径的中点(不一定恰好是某个结点,可能在某条边的内部)是唯一的,我们称该点为树网的中心。

  偏心距ECC(F):树网T中距路径F最远的结点到路径F的距离,即

    ECC(F)=max{d(v,F),v∈V}。

  任务:对于给定的树网T=(V, E,W)和非负整数s,求一个路径F,它是某直径上的一段路径(该路径两端均为树网中的结点),其长度不超过s(可以等于s),使偏心距ECC(F)最小。我们称这个路径为树网T=(V,E,W)的核(Core)。必要时,F可以退化为某个结点。一般来说,在上述定义下,核不一定只有一个,但最小偏心距是唯一的。

  下面的图给出了树网的一个实例。图中,A-B与A-C是两条直径,长度均为20。点W是树网的中心,EF边的长度为5。如果指定s=11,则树网的核为路径DEFG(也可以取为路径DEF),偏心距为8。如果指定s=0(或s=1、s=2),则树网的核为结点F,偏心距为12。

p1968.gif

  求给定树网的最小偏心距。

  

  说实话读懂题目(难于登天),思路还是清晰的

  先Floyd求路径长度,然后找直径(每条都要找出来)。然后枚举直径上每条小于s的路径,判断标准是:

           

  然后对这条路径求偏心距(判断是否是路径上的节点和上面类似)。最后取一个最小值。

  

初始代码

   -----------------------2017.4.30新更

  今天又做了一遍这个题,发现了一些很有趣的性质:满足最小偏心距的路径一定在直径上,并且属于所有直径交叉部分的一段(还是经过中心来着??)。然后就可以直接枚举所有小于等于s的路径找偏心距了。

  比如说有两条直径,它们一定是交叉的,而且一定经过中心或是中心所在的路径。假设交叉的部分长度为L1,直径剩余部分为L2。

  显然有:每个点与其距离最远的点必定是某直径的端点。

  所以说,如果符合条件的路径没有经过某个交叉点:在公共部分,最小偏心距<=L2,;在非公共部分,最小偏心距>=L2.

  那么符合的路径一定在公共部分更优。而经过交叉点的路径最小偏心距至少是L1,而对于不完全在公共部分的路径,其偏心距拥有同样的下界L1。

  由此可以发现【可以吗我还真不知道,求大佬给出严谨推理orz】枚举可能的核,然后找最小偏心距就A了【然而是A了】

posted on 2016-10-10 21:03  啊?  阅读(342)  评论(0编辑  收藏  举报