洛谷蓝题解题报告(2020.8.4-2020.8.9)

洛谷蓝题解题报告(2020.8.4-2020.8.9)

  • 2020.8.4
    • P1450 [HAOI2008]硬币购物
    • P1438 无聊的数列
    • P2279 [HNOI2003]消防局的设立
    • P1463 [POI2002][HAOI2007]反素数
    • P1490 买蛋糕
  • 2020.8.5
    • P1641 [SCOI2010]生成字符串
    • P1492 猩猩散步
  • 2020.8.6
    • P1005 矩阵取数游戏
    • P1278 单词游戏
  • 2020.8.7
    • P2261 [CQOI2007]余数求和

2020.8.4

P1450 [HAOI2008]硬币购物

考察:背包dp,容斥原理
主要是一个dp容斥的思想:
用背包处理无数量限制的方案值,减去某些硬币超出数量限制的方案值。
减去不合规范方案的方法:
直接将总的钱数减去(该硬币数+1)*该硬币价值进行dp,确保该硬币超出限制。
最后套一下容斥原理的公式即可。

P1438 无聊的数列

考察:线段树,差分
区间求和,区间修改,自然想到线段树,以等差数列的方式修改,自然想到用相邻两数之差(即差分的思想)进行建树,查询时即为1-i的区间和。
几乎是个线段树差分的模板题。

P2279 [HNOI2003]消防局的设立

考察:树形dp
看到树,看到求最小值,自然想到树形dp.
树形dp就是从子孙的状态向父亲的状态推,根据题意,两个消防局之间可以至多空4个点,因此想到设状态为子树中离自己最近的消防局的距离,从1-4不同的状态转移到父节点。
树形dp的准板子题

P1463 [POI2002][HAOI2007]反素数

考察:搜索
题意即为1-N区间内找约数最多的数
看到N的范围,这里用质数筛,用约数公式,用dp都不好使
想到每个数分解成质因数的数量是log级别的
于是筛出1-20之间的素数,暴力枚举每个质数的个数,用约数个数公式比较计算。
一种全新的计算约数个数的思维。

P1490 买蛋糕

考察:搜索
题意为用最小个数的正整数去表示 1 − n 1-n 1n中的所有数。
联系到经典的贴邮票问题, n n n的范围 1 0 3 10^3 103,想到搜索。
每次搜索,都尝试在已经选择的数后再添加一个更大的数,设已选择数列的最大值为 m a x max max,可以组成的最大的数为 s u m sum sum,已经选了 n u m num num个数。
枚举下一个数i的范围 [ m a x + 1 , s u m + 1 ] [max+1,sum+1] [max+1,sum+1],容易得到,添加数后 s u m sum sum应改为 s u m + i sum+i sum+i.
简而言之:

dfs(num,sum,max)
	for i<-max+1 to sum+1 do
		dfs(num+1,sum+i,i)

2020.8.5

P1641 [SCOI2010]生成字符串

考察:卡特兰数
卡特兰数应用的经典例题。
详细见:卡特兰数,折线定理。
这里给出公式: ( m n + m ) − ( m − 1 n + m ) \dbinom{m}{n+m}−\dbinom{m-1}{n+m} (n+mm)(n+mm1)
详细证明见百度

P1492 猩猩散步

考察:组合数
式子很好列,关键是答案的输出。
肯定是要用到高精(python)
这里我们考虑一种非常朴素的计算答案的方法。
对组合数进行约分
如何约分?
1 − m + n 1-m+n 1m+n的所有数进行素因数分解(其实只需要一个最小质因数的值)
若在分子上,就将这个素因数的出现次数+1,若在分母上,出现次数-1.最后把所有的素因数乘起来,高精100位数组即可。

2020.8.6

P1005 矩阵取数游戏

考察:区间DP,高精
容易想到,对于每一行取数的最大值,等于先取左边数与先取右边数的较大值。
因此运用区间DP。
转移方程:
d p [ k ] [ k + j ] = m a x ( 2 ∗ d p [ k + 1 ] [ k + j ] + 2 ∗ g r i d 1 [ i ] [ k ] , 2 ∗ d p [ k ] [ k + j − 1 ] + 2 ∗ g r i d 1 [ i ] [ k + j ] ) dp[k][k + j] = max(2 * dp[k + 1][k + j] + 2 * grid1[i][k], 2 * dp[k][k + j - 1] + 2 * grid1[i][k + j]) dp[k][k+j]=max(2dp[k+1][k+j]+2grid1[i][k],2dp[k][k+j1]+2grid1[i][k+j])
其中 d p [ i ] [ j ] dp[i][j] dp[i][j] i − j i-j ij列取数的最大值, g r i d 1 [ i ] [ j ] grid1[i][j] grid1[i][j]为矩阵上 a i , j a_{i,j} ai,j的值。
对于每一行分别处理再相加即可。
至于高精,重载运算符后正常算就好。

P1278 单词游戏

考察:搜索
看到这个N的范围就知道用搜索了。
先预处理每个单词能往后接的所有单词,用向量存一下。
然后大力搜,枚举每一个单词作为开头的单词。
注意:
对于每一个搜索到的状态压缩存储起来,空间复杂度是 O ( 2 N ) O(2^ N) O2N,时间复杂度 O ( 2 N ) O(2^ N) O2N.

2020.8.7

P2261 [CQOI2007]余数求和

考察:数论分块
k ( m o d i ) k \pmod i k(modi)的形式难以计算,考虑最朴素的转化方式。
k ( m o d i ) = k − ⌊ ( k i ) ⌋ ∗ i k \pmod i = k - \lfloor(\frac{k}{i}) \rfloor*i k(modi)=k(ik)i
右边的式子直接数论分块愉快AC

你可能感兴趣的:(算法)