校网赛复盘
校网赛复盘
我是个菜菜。
题目:https://acm.xidian.edu.cn/campus/2023/online-problemset.pdf
T1 有坑信我
注意到 $a \times b \times c$ 是 10 的倍数,所以可知 $a,b,c$ 其中至少有一个 2 的倍数和一个 5 的倍数。
将其中 2 的倍数和 5 的倍数分别除以他们的因数,可以根据题目知道剩下的数乘积小于 $2^{64}$,故答案可以用 unsigned long long 存储。
该题亦可用 Java 解决。
紫不要也罢……
T2 圆周率
- 打表,注意输出的是第 a 到都第 b 位。
也是紫不要也罢……
T3 N变形战士
- 对于有 $n$ 个属性值的雷达图,相邻两个点的属性值 $a_i,a_j$,可以证明其相邻的三角形面积为 $a_i \times b_i \frac{sin\frac{2\pi}{n}}{2}$ 。问题转化为重新排序使相邻的属性点乘积最大。
- 很容易想到将属性值排序后挑出第 1 大的数,并将第 2 大的数和第 3 大的数放在其左右两侧,这样依次按照 $2k,2k+1$ 的顺序放置在数列的左右侧,直到第 n 大的数被放置。之后求出相邻的数的总和,其值为 $S_n=\sum_{i=3}^{n}a_ia_{i-2}+a_1a_2+a_{n-1}a_{n}$。注意 $a_1a_2$项不要漏掉。
- 可以证明交换任两个数都会使值的总和减少。这里不证了。
- 复杂度 $O(nlogn)$。
还是紫不要也罢……
T4 杠杆
对于任意一个杠杆的分布情况,其都可以表示成所有力矩相等情况对应的情况数的总和。
对于一个杠杆左右力矩相等且都为 $k$ 的情况,我们可以用杠杆左侧的力矩为 $k$ 的情况数,杠杆右侧的力矩为 $k$ 的情况数,杠杆支点情况数的乘积表示。其中杠杆支点只有放和不放 2 种情况。
对于两侧的支点,我们用 $dp[i][j]$ 来代表其在两侧有 $i$ 个摆放点的情况下力矩总和为 $j$ 的情况总数,根据题目可得 $dp[0][0]=1$ 。
在已经有 $i-1$ 个点所有力矩和的情况下,我们很容易根据第 $n$ 个点是否放置的情况分为两种:
- 如果选择不放置,假设 $i-1$ 个点力矩和为 $j$ 的情况数为 $k$,那么此时 $i$ 个点的力矩和为 $j$ 的情况数也会加上 $k$。即 $dp[i][j]= dp[i][j] + dp[i-1][j]$ 。
- 如果选择放置,假设 $i-1$ 个点力矩和为 $j$ 的情况数为 $k$,由于选择导致力矩变化,第 $i$ 个点的力矩为 $i$ ,此时 $i$ 个点的力矩和为 $i+j$ 的情况数也会加上 $k$。即 $dp[i][i+j]= dp[i][i+j] + dp[i-1][j]$ 。
依次遍历各种可能的相等情况并统计总和,对于 $n$ 个点,其力矩总和的范围为 $[0,n(n+1)/2]$。
注意数据范围和模数。
复杂度 $O(n^3)$。
凌晨才写出来,不好评价……
T5 五子棋
对于一场合法的棋盘,其只有两个可能,黑子走棋(获胜)或白子走棋(获胜)。
- 如果黑子走棋,此时黑子的个数等于白子的个数+1,此时仅可能黑棋获胜。
- 如果白子走棋,此时黑子的个数等于白子的个数,此时仅可能白子获胜。
- 如果子数不满足上述判定,为不合法棋盘。
对于一场获胜的结算,若其为合法棋盘,则应该满足在走棋一方走棋前,场上没有任何五子连线(这里假设五子以上的连线内可以有多条五子连线)。也就是说,如果场上经过连线数最多的子,等于场上的五子连线数,那么这一场棋局就是合法的。
检测横,竖,斜的五子,分别统计各自经过的连线数和总共的五子连线数。
复杂度 $O(n^2)$。
佬写的是dp,瞬间觉得自己是个小丑……
T6
- 题意可转化为:给定一张由集合A到集合B的二分图G,其中每个匹配给定一个权值v。求出在完美匹配的情况下,该图中最大权值的最小值。
- 因为是最值的最值问题,所以考虑二分答案。我们以该权值为标准来分割区间,设为X。这里说的标准可以理解为我们假定的正确答案。显然,在×左边(即小于X)的部分是合法的。所以我们用×对二分图进行二次处理,将权值大于×的匹配舍去。对处理后的图用匈牙利算法求最大匹配,看其是否满足完美匹配即可。
- 复杂度 $O(n^3)$。
附:二分图上的边一般叫做匹配。
复杂度$O(n^4)$也能过。
但是自己没做出来,不说了去学了……