2017 NWERC
Problem A. Ascending Photo
题目描述:给出一个序列,将其分成\(m\)份(不需要均等),使得将这\(m\)份重新排列后构成的是不下降序列,输出最小的\(m-1\)。
solution
待解决。
Problem B. Boss Battle
题目描述:有环形的\(n\)根柱子,只有一根柱子后面有boss
,每次向一根柱子投一个炸弹,炸弹波及范围为那根柱子和相邻的柱子,若boss
在这三根柱子后面,则boss
被炸死,若boss
没有被炸死,则boss
会选择原地不动或者走到相邻的柱子,问最坏情况下要用多少个炸弹。
solution
当\(n \leq 3\)时,答案是\(1\)。
但\(n>3\)时,观察可得答案是\(n-2\)。因为在每次扔完炸弹后,第二次扔在那个炸弹的顺时针数两个的位置,这样boss
不可能在的位置就会增加一个(不可能存在的位置为一个连续的区间,顺时针最前增加两个位置,最后减少一个位置),最后剩下三个不确定的位置时,把炸弹扔到中间的柱子即可。
时间复杂度:\(O(1)\)
Problem C. Connect the Dots
题目描述:有\(4 \times 4\)十六个点,每个点有一个编号,按编号顺序一笔画,问最少需要多少条折线。
solution
假设折线由角度\(angle\)穿过\(i\),则可以根据\(angle\)推出可以以什么角度穿过\(i+1\),而可行的角度是一个连续区间。由\(4 \times 4\)的任两个点组成的角度不是很多,按这些角度搜索一下就好了。
这是大致的想法,具体还没实现出来。。。
Problem D. Dunglish
题目描述:给出一个荷兰文的句子(\(n\)个单词)以及\(m\)个荷兰文单词的英文翻译,但一些翻译是正确的,一些是错误的。判断这个句子是不是只有一种翻译,若只有一种翻译,则输出那种翻译,并判断这个翻译是正确的还是错误的;若有多种翻译,则输出有多少种翻译是正确的,有多少是错误的。
solution
模拟
时间复杂度:\(O(nlogm)\)
Problem E. English Restaurant
题目描述:饭店里有\(n\)个桌子,每个桌子最多有\(a_i\)个人坐。饭店经营\(t\)个小时,每个小时会有\(1\)~\(g\)个人来饭店,然后他们会选择一张没有人坐的,并且坐得下的最小的桌子坐下,如果没有,他们就会离开。坐下的人会到饭店结束经营才离开,问最后剩下人数的期望值。
solution
将\(a_i\)从小到大排序,大于\(g\)的\(a_i\)令其变成\(g\)即可。然后补\(t\)个\(g\)在最后,作为离开的人占位。
先预处理出\(g_{i, j}\)表示\([i, j]\)的桌子都被占,其它桌子没有被占的期望,计算方式是用区间\(dp\)。选\([i, j]\)中的一个\(k\),表示是\([i, j]\)中最后占的桌子,计算期望值时要注意有一个组合数\(C_{j-i}^{k-i}\),表示前\(i-j\)张桌子的排列顺序种数。
再利用\(g_{i, j}\)算出\(f_{i, j}\)表示前\(i\)张桌子占了\(j\)张期望的人数。枚举\(k\)表示\(i-k+1\)~\(i\)都占有,\(i-k\)不占,当\(k=0\)时表示\(i\)不占。注意这里也有一个组合数\(C_{j}^{k}\),表示前\(j\)张桌子的排列顺序。
时间复杂度:\(O(n^3)\)
Problem F. Factor-Free Tree
题目描述:给出一棵带点权的树的中序遍历,构造一棵树,使得每个节点与它的祖先都互质,输出这棵树,或无解。
solution
首先预处理出每个节点\(i\)的左边第一个与\(i\)不互质的位置\(le[i]\),以及右边第一个与\(i\)不互质的位置\(ri[i]\)。
接着搜索区间\([L, R]\),表示现在在构造\([L, R]\)这棵树,然后在\([L, R]\)中找出一个与除它本身外所有数都互质的数,这个数作为树根,然后搜索左右子树。
这里有一个技巧,就是两头向中间找那个数,这样如果那个数在两端,在很快就能找到那个数,如果在中间,则分出的两个子树比较平衡,这会节省不少时间。
时间复杂度:\(O(nlogn)\)
Problem G. Glyph Recognition
题目描述:给出\(n\)个点,然后分别用正三、四、五、六、七、八边形围住这些点,要求正多边形面积最小;又用正多边形摆在点的中间,使得正多边形内(不包括边界)没有点,要求正多边形面积最大。分别求出这些正多边形对应的最小最大面积,求出最小比最大的最大值以及所对应的正多边形类型。注意:正多边形的中心在原点,且正多边形的一个顶点在\(x\)轴。
solution
模拟。
时间复杂度:\(O(n^2)\)
Problem H. High Score
题目描述:有四个数\(a, b, c, d\),现将\(d\)分到\(a, b, c\)中,即\(a'=a+x, b'=b+y, c'=c+z, x+y+z=d, x, y, z \geq 0\),使得\(a'^2+b'^2+c'^2+7 \cdot min\){\(a, b, c\)}最大,输出最大值。
solution
当\(d\)比较大时,肯定是全部分到最大的那个数比较好;当\(d\)比较小时就要枚举一些。所以定好一个界限,\(d\)大于这个界限时全部分到最大的那个数,否则枚举。
时间复杂度:\(O(7\times 10^7)\)
Problem I. Installing Apps
题目描述:有一个硬盘,容量为\(c\),现有\(n\)个软件,每个软件下载到硬盘后大小为\(d_i\),安装后为\(s_i\),安装时\(d_i\)直接转换为\(s_i\),因此装第\(i\)个软件前硬盘中至少有\(max\){\(d_i, s_i\)}容量。确定安装顺序,使得安装的软件数最多。
solution
按照贪心思想,可以按照安装后释放空间的大小来排序,即\(d_i-s_i\)从大到小排序。然后背包\(dp\),因为这里要记录方案,所以要用二维数组来存储。
时间复杂度:\(O(nc)\)
Problem J. Juggling Troupe
题目描述:开始时\(n\)个人排成一列,每个人手上有至多两个球,每一轮手里有多于\(1\)个球的人扔一个球到左边,扔一个球到右边,如果那个人在最左边或最右边,则直接将球扔掉(即没有人接的球直接扔掉)。每一轮的球是同时扔的,问最后无法再进行时的状态(每一个人手上有多少个球)。
solution
找规律。发现如果只有一个\(2\)时,设\(2\)的位置为\(i\),\(i\)的左边第一个\(0\)的位置为\(L\),\(i\)右边第一个\(0\)的位置为\(R\),最终的状态为:位置\(L, R\)变为\(1\),位置\(L+R-i\)变为\(0\),\([L, R]\)的其它位置变为\(1\)。
又发现每个\(2\)是独立的,即每个\(2\)可以不同时扔球,可以分开处理。所以最终的解法就是按照只有一个\(2\)的解法解决每个\(2\)即可。
时间复杂度:\(O(nlogn)\)
Problem K. Knockout Tournament
题目描述:有\(n\)个人进行淘汰赛,每个人有一个评分\(r_i\),当评分为\(a\)的人遇到评分为\(b\)的人时,\(a\)赢得比赛的概率为\(\frac{a}{a+b}\)。现在要将这\(n\)个人排好顺序,使得原来排在第一的人赢得比赛的概率最大,求出这个概率。注意:\(n\)可能不是\(2\)的幂,则第一轮排在最后的一些人直接到第二轮,使得第二轮的人数是\(2\)的幂。
solution
按照一般思维,肯定是要赢的那个人遇到的人越垃圾越好,评分高的人遇到的人越强越好。所以将评分从大到小排序,第一轮处理一下就好了(可以补\(0\)),\(p[i][j]\)表示\(j\)在第\(i\)轮胜出的概率,设\(j\)在第\(i\)轮可能遇到的人为\(k\),则\(p[i][j]+=p[i-1][j] \times p[i-1][k] \times \frac{r_j}{r_j+r_k}\)。\(k\)是一个区间,可以在\(logn\)时间内得出。
时间复杂度:\(O(nlogn)\)