市赛小学组题目讲解

1384 方程求解 2021年青岛市(小学组)
1385 文件复制 2021年青岛市(小学组)
1467 洪水 2021年青岛市(小学组)

链接:http://1.14.136.201/problemset.php?search=2021%E5%B9%B4%E9%9D%92%E5%B2%9B%E5%B8%82%EF%BC%88%E5%B0%8F%E5%AD%A6%E7%BB%84%EF%BC%89

讲解:

趣味三角(triangle.cpp)

对于40%的数据可以暴力整个杨辉三角然后进行求和。

对于60%的数据,可以枚举每一行,利用杨辉三角形的性质,设整个杨辉三角是0 ~ n-1行,第i行的和为2的i次幂,求和即可。

对于90%的数据,2的0次幂 + 2的1次幂 + 2的2次幂 + … + 2的n-1次幂 = 2的n次幂 - 1 ,利用公式进行快速幂求和即可。

对于100%的数据,求解的主要问题为2的n次幂 % m,但是n特别的大,m保证是质数,2保证与m互质(若m是2,需要特判一下),如此便可以使用费马小定理:2的n次幂 同余于2的(n%(m-1))次幂,然后再使用快速幂求解即可。

跳格子(grid.cpp)

首先将矩阵上下左右颠倒过来,方便处理。

对于5%的数据,所有数据<=0,直接全部加起来求和即可。

对于30%的数据,可以考虑暴力dfs进行求解,每一步考虑是否为第一次进入此行,然后分方向走即可。

对于70%的数据,首先维护每一行往右延展的最远的能取得最小值f[i][j],这个可以通过简单的dp得到,考虑dp[i][j]代表对于第i行,若第一次进入位置为j的最小值,那么即可枚举i-1行第一次进入的位置为k,记录f[i][j]为第i行第j个位置向右延展可以取得的最小值,上一行k的位置需要先延展到j的位置,然后再加上f[i-1][j]即可。

对于100%的数据,首先维护每一行往右延展的最远的能取得最小值f[i][j],这个可以通过简单的dp得到,那么在第i行如要处理dp[i][j]的值,那么第i-1行选择往上走的位置k要<=j,状态转移方程为dp[i]

[j]=min(dp[i][j],dp[i-1][k]+sum[i-1][j-1]-sum[i-1][k]+f[i-1][j])那么问题便抽象成了上一行维护的前缀最小值问题,使用数据结构或者前缀最小值维护即可,复杂度O(n*m)

亮度调节(inverse.cpp)

对于30%的数据,n<18,对于每个位置都有两种可能,要么修改,要么不修改,那么便是一个2^n的二进制枚举。

对于另外5%的数据,ai的绝对值为1,直接可以修改所有数为1或者-1,答案为0。

对于100%的数据,首先我们观察绝对值最大的数字,前后不存在绝对值比他大的数字,如果这个数是正数,只有后面绝对值比它小的数字会产生贡献,如果这个数字是负数,只有前面绝对值比它小的数字会产生贡献,因为它是绝对值最大的,它不会对其他的数字产生贡献。因此,我们发现每个数的正负产生的贡献和前后绝对值比它小的数的数量有关,由此可以用树状数组维护前后绝对值比它小的数字的个数,然后贪心选择即可。

鸣谢:

青岛图灵科技文化培训学校

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值