Skip to content

Latest commit

 

History

History
54 lines (29 loc) · 2.9 KB

srm-774.md

File metadata and controls

54 lines (29 loc) · 2.9 KB

Topcoder SRM 774

LandSplitter

题意:有一个长度为$N$的木棍,有两种操作:

  • 把一个长度为$n$的木棍分成长为$x$和长为$n-x$的木棍的话,操作代价是$x(n-x)$
  • 把一个长度为$n$的木棍分成长为$x$,长度$y$和长为$n-x-y$的木棍的话,操作代价是$xy+x(n-x-y)+y(n-x-y)$

要求把木棍分成若干段,每段长度都在区间$[A, B]$内,求最小代价

$1 \le A \le B \le N \le 10^8$

题解:首先第二个操作其实就是执行了两次第一个操作,可以无视。然后把长度为$N$的木棍看成$N$个点的完全图,那么一次操作就是把这个图分成了两个点数为$X$和$Y$的完全图。

假设你最后分成的段为$a_1,a_2,\dots,a_k$,那么代价就是$\binom{N}{2} - \sum_{i=1}^{k} \binom{a_i}{2}$。所以,我们的目的就是为了使上式右边的和最大。

只要每个$a_i$尽量大即可。于是我们优先把每段都看成$B$那么长,那么考虑最后一段长度为$x$:

  • $A \le x \le B$:不需要再砍了,直接作为最后一段即可。

  • $x < A$:我们需要从其他段里拿一些过来,使得$x$变成$A$。每次就贪心的拿一个长为$B$的,尽量加上去即可。

ClassRankings

题意:有三个班级,分别有$amt_0, amt_1, amt_2$个人,第$i$个班级每个人分数范围为$lo_i$到$hi_i$。假设每个班级的人都无法区分,每个人的分数都互不相同,问把这些人按照分数排序后有多少种可能的序列。对$10^9+7$取模

$1 \le amt_i \le 50, 1 \le lo_i \le hi_i \le 1000$

题解:令$dp(i,j,k,x)$表示三个班级分别有$i$,$j$和$k$个人确定了分数,分数按照从小到大分配后,最后一个人的分数恰好是$x$的方案数。然后就是枚举下一个人来自哪个班级,以及给它分配什么分数即可。

FillInTheDAG

题意:有一个$n$个点$m$条边的有向无环图,第$i$条边从$f_i$到$t_i$。保证仅有节点$0$的入度为$0$,仅有节点$n-1$的出度为$0$。现在你要给每个点分配一个标号$x_i$使得:

  • $x_0=0$,$x_{n-1}=1$

  • 令$S(v)$是能够$v$能够到达的点,$T(v)$是能够到达$v$的点,那么$x(v)=\frac{(min_{y \in S(v)} x_y) + max_{z \in T(v)} x_z)}{2}$

输出$x(v)$的最简分数形式,保证存在一组解使得分子和分母都在有符号$64$位整数里。

$3 \le n \le 100, 2 \le m \le 1000, 0 \le f_i < t_i < n$

题解:每次选择一条从$s$到$t$的路径,使得:

  • 除了$s$和$t$,其它点都没有被标号;

  • 点$s$和$t$的标号之差除以路径长度最小。

然后给这条路径加上一个等差数列即可(如何证明?)。