2019.08.17【NOIP提高组】模拟B组总结

总结


估分:100+100+0=200
总分:100+70=170

T1:
题意是给你N*M的格子,其中有一些格子上有污点,你可以每次涂掉连续的不超过R行的污点或连续的不超过C列的污点,求最少次数。

注意到n,m的范围很小,我们可以先枚举一行或一列选的状态,同时一边处理出最少所用的次数。
之后暴力处理出剩余的没有涂掉的污点,这些点要用列的操作来涂。
类比于行,我们只要预处理出每个列的状态所对应的最少次数即可。

T2:
题意是定义n!k=(n-1)!k*n!(k-1),当k=0时n!k=n,当n=0时n!k=1,求n!k的约数的个数。
容易想到dp。
把整个过程看做一个矩阵。
设f[i][j][k]表示做到第i行第j列这个数的第k个质因子有多少个。
f[i][j][k]=f[i-1][j][k]+f[i][j-1][k]。
最后答案即为i=1~k(f[n][m][i]+1)的乘积。


但是我们发现如果n开大一些这样的算法就通不过了。
我们可以想因为只有(i,0)的点才会对答案有贡献,因此我们可以算出从(i,0)推到(n,m)的方案数,再用1~n的质因子直接累加即可。
那么(i,0)推到(n,m)的方案数是多少呢?
同样抽象成一个二维平面,我们每次从(i,0)这个点出发,走到(n,m)的方案数,实际上就是C(n-i+m-0,n-i)。
至此我们可以求出每个质因子的倍数,此题得到解答。

比赛中因为数组开小了而失去了30分,真不应该。
但其实主要原因是时间分配不得当,先做了最后一题。

T3:
题意是给你n个点和P,Q,要你求两个点构成的斜率最接近于P/Q,以“A/B”的形式输出斜率。
相当于是然你求(y1-y2)/(x1-x2) 最接近于P/Q的值X和Y。
通分,得到:
Q(y1-y2)/Q (x1-x2)最接近于P(x1-x2)/Q(x1-x2)
将分母去掉:
Q(y1-y2)最接近于P(x1-x2)
拆项:
Qy1-Qy2最接近于Px1-Px2
移项:
Qy1-Px1最接近于Qy2-Px2

至此,我们只用对每一个点的上式排一遍序,去相邻的比较即可。

考虑另一种思路。

我们将式子拆成:
| Q(y1-y2) / Q(x1-x2)-P(x1-x2) / Q(x1-x2) |最小

| ((Q(y1-y2)-P(x1-x2)) / Q(x1-x2) |最小

| ((Qy1-Px1)-(Qy2-Px2)) / Qx1-Qx2 |最小

我们将这个式子看成斜率的形式,
即Q(y1-Px1)=Y1,Q(y2-Px2)=Y2,Qx1=X1,Qx2=X2,得:
| (Y1-Y2)/(X1-X2) | 最小
也就是我们将每个点用上式变成一个新点,再求两个点所构成的斜率的绝对值最小值。
若两个纵坐标直接有一个点,那么这中间点于两边点构成的斜率总有一个会比两边点构成的斜率小。
因此我们将点按照纵坐标排序,
用两两相邻的纵坐标更新答案即可。


注意数据范围,检查数组是否越界。
分配好时间,端正好心态。

马上就要NOIP了,好好准备。

你可能感兴趣的:(总结)