2018 German Collegiate Programming Contest (GCPC 18)
Contest Info
[Practice Link](https://codeforc.es/gym/102021)
Solved | A | B | C | D | E | F | G | H | I | J | K | L | M |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
9/13 | - | - | O | O | O | O | - | O | O | - | Ø | O | O |
- O 在比赛中通过
- Ø 赛后通过
- ! 尝试了但是失败了
- - 没有尝试
Solutions
Problem C: Coolest Ski Route
题意:
给出一个\(DAG\),寻找一条最长路,每个点只能经过一次。
思路:
因为是个\(DAG\),直接拓扑序\(DP\)即可。
为什么对每个点为起点跑\(Dijkstra\)是错误的?
\(Dijkstra\)的本质是贪心,它只能用来求边权不为负的最短路,将权值取负去用\(Dijkstra\)跑最短路是错误的。
Problem D: Down the Pyramid
题意:
给出数字金字塔的第二层,问有多少种合法的第一层的数的方案。
思路:
令第二层的数一次为\(b_1, b_2, \cdots, b_n\),第一层的数为\(a_1, a_2, \cdots, a_{n + 1}\)。
那么有一下式子:
因为\(a_i \geq 0\),所以这些条件会将\(x\)限定在一个范围内,这个范围内的数的个数就是方案数。
Problem E: Expired License
题意:
给出两个实数\(a, b\),要求找到两个素数\(p, q\)使得\(\frac{a}{n} = \frac{p}{q}\)。
保证给出的实数小数点后最后只有\(5\)位。
思路:
先将\(a, b\)都乘\(10^5\)变成一个整数,然后约分。
约分后判断两个数是不是都是素数,但是要注意如果约分后为\(\frac{1}{1}\),那么答案应该为\(\frac{2}{2}\),因为\(1\)不是素数。
Problem F: Fighting Monsters
题意:
有\(n\)个怪兽,每个怪兽有\(m_i\)的攻击力和生命值。
选择两个怪兽,可以钦定一个怪兽先攻击,最后一个怪兽死亡后,另一个怪兽的生命值要为\(1\)。
思路:
两个合法的怪兽他们的\(m_i\)是一对相邻的斐波那契数。
Problem H: Hyper Illuminati
题意:
给定一个\(m\),要求找一对\((n, s)\),使得:
\(n \geq 3\)。
思路:
因为\(n \geq 3\),所以\(n, s\)的取值范围都很小,直接暴力枚举判断即可。
Problem I: It’s Time for a Montage
题意:
有\(n\)个英雄和\(n\)个反派,他们的能力值分别为\(h_i, v_i\)
他们会按照顺序一一对决,对决的结果就是\(h_i, v_i\)比大小,如果某一轮决出了胜负,那么就是某一方赢了。
如果最后\(n\)轮都是平局,那么是英雄那一方胜利。
但是现在英雄可以进行训练,训练\(x\)天后,所有英雄的能力值加\(x\),反派的能力值不变。
问至少需要训练几天,英雄那一方可以胜利。
思路:
\(n, h_i, v_i\)都很小,直接暴力枚举天数,暴力判断即可。
Problem K: Kitchen Cable Chaos
题意:
有两个器械之间的距离为\(g\),现在有\(n\)根线段,他们的长度为\(d_i\)(包含两端\(5cm\)的金属箔),线段与线段之间需要用金属箔接触相连接,一段连接出来的电缆,它的质量为连接处的最短的重叠部分的长度。
电缆最后也要和器械的金属箔相接触,这一段重叠部分也被纳入质量的考量。
问如果选择线段,最后得到的质量最高。
像这张图里面,\(1\)号连接处是完全覆盖的,他们的重叠部分为\(5\),\(2\)号连接处他们是恰好接触的,重叠部分为\(0\),所以这段线缆的质量为\(0\)。
思路:
我们令\(\sum d\)表示不包含金属箔的线的总长度。
那么显然接触部分的总长度为\(g - \sum d\)。
那么假设选了\(i\)根线,那么一共有\(i +1\)个接触部分,我们要让重叠部分尽量均摊,这样最小值最大。
即重叠部分为\(10 - \frac{g - \sum d}{i + 1}\)。
用\(f_{i, j}\)表示用了\(i\)个物品,能否拼出\(j\)。 \(01\)背包即可。
Problem L: Logic Puzzle
题意:
扫雷图复原。
Problem M: Mountaineers
题意:
在一个\(n \cdot m\)的矩形上,每个点有一个权值\(h_i\),每次可以上下左右移动,有\(q\)次询问,每次询问给出起点和终点,询问从起点到终点的路径中经过的点的最大权值的最小值是多少?
思路:
将点按照权值排序,然后建立可持久化并查集,慢慢加入到并查集中。
对于询问,直接二分权值,在对应版本的并查集上查询两点是否连通即可。