比赛-Round 1 (14 Jul, 2018)

1. 同行

以 1, 2, N 为源点跑分别跑最短路,假设边权为 1 。用 dis[1][N]*B+dis[2][N]*E 和 dis[1][i]*B+dis[2][i]*E+dis[N][i]*P (满足 1 <= i <= N) 来更新答案即可。

2. 长跑

设 f[i][j] 表示到达的第 j 个点是第 i 号点,答案是 f[N][N-K] .

f[1][1] = 1

f[i][j] = min{ f[t][j-1] + cost(t, i) }

时间复杂度 O(n3) ,略大,但是注意到 j 是有限制的,即 j+N-i >= N-K ,在动规的循环里加入这个限制,加个计数器会发现最多会跑大概 6 千万次,可以过。

不过据说纯暴力 500也可以过。

3. 糖果

考虑先给每个小朋友发足够的糖果,然后收回。可以发现,应尽量“平摊”地收回糖果。这点很重要。即每次考虑对每个有糖的小朋友都收回 1 颗糖果,直到收回所有超额发出的糖果即可。当然这个收的过程肯定不能每次暴力扫暴力 -1 ,应该先对小朋友糖果数排序,然后从小到大讨论……

正确性由柯西不等式可以证明。

4. 抗议

注意到分的组数没有意义,所以可以定一维的动规 f[i] 表示前 i 头牛的分组方案数。

f[0] = 1

f[i] = Σf[j] (j < i 且 sum[i]-sum[j] >= 0)

对 sum 离散化之后可以用树状数组维护,省去枚举 j 。即先 f[i] = GetSum(hs[i]) 然后再 Add(hs[i], f[i]) 。答案是 f[n] 。

我改悔罢!

一开始想出了 4 题暴力动规,优化暂时没想出来。发现 1 题看起来很水,所以赶紧写了一波出去透气。然后非常弱智地写了单向边,存反图。图论题居然连边是有向还是无向都不仔细看,唉……然后写了 2 题正解,用了 20 分钟证明 O(n3) 的暴力是可行的。之后慢慢搞出了 4 题树状数组优化。最后一个小时用手列数据+数学证明的方式,在强力样例的帮助下调试了半个小时,写对了。

好好看题!

原文地址:https://www.cnblogs.com/ghcred/p/9309206.html