Part 1 入门阶段
Part 1.1 从零开始
P1421 小玉买文具
基础语法,可以考虑扩大十倍用a*10+b / 19 来避免取整。
展开代码
P1909 买铅笔
8说了,自己看吧
展开代码
P1089 津津的储蓄计划
8说了,自己看吧
展开代码
P1085 不高兴的津津
8说了,自己看吧
展开代码
P1035 级数求和
8说了,自己看吧
展开代码
P1980 计数问题
这题还是有点意思。
考虑最简单的思路,遍历然后计算每位的贡献,但是复杂度是nlog10(n)
但是还可以有log10(n)的写法
考虑计算每一位对所有答案的贡献。
比如1-10846为例,计算含目标数字不为0的情况,共有三种情况。
计算1-10846十位为7的个数:
此时a = 108 b=4 c=6 ,不难看出其实是将原数拆成了a,b,c三个部分
那么贡献=108 * 10 因为左边a从0~107与b=7再和c从0~9组合构成所有答案
计算1-10846十位为4的个数:
那么贡献=108 * 10 + 6 + 1 因为左边a从0~107与b=4再和c从0~9组合 + 左边a=108 b=4 c=0~6构成所有答案
计算1-10846十位为3的个数:
那么贡献=109 * 10 因为左边a从0~108与b=3再和c从0~9组合构成所有答案
最后还要注意如果要计算的是0,情况还有所不同需要特殊判断。
计算1-10846千位为0的个数
那么贡献=(1-1) * 1000 + 846 + 1 因为a从1~1 b=0 c从0~846组合构成所有答案
计算1-10846十位为0的个数
那么贡献=108 * 1000 因为a从1~108 b=0 c从0~9组合构成所有答案
展开代码
P1014 Cantor表
不讨喜的规律题
展开代码
P1307 数字反转
8说了,自己看
展开代码
Part 1.2 数组基础
P1046 陶陶摘苹果
8说了,自己看吧
展开代码
P1047 校门外的树
暂时想到的三种解法
第一种,每个区间类似于染色标记,最后遍历一遍看哪些未被染色。复杂度O(m*l)
第二种,每个区间排序后合并,时间复杂度为O(mlogm)
第三种,写起来最方便,也是本题解的做法。考虑差分思想,每个起点+1,终点后面一个位置-1。最后遍历看0的数量。
展开代码
P1427 小鱼的数字游戏
基础的栈思想
展开代码
P2141 珠心算测验
注意读题,2+3=5和1+4=5只算一种
展开代码
P5594 【XR-4】模拟赛
8说了
展开代码
Part 1.3 字符串基础
P5015 标题统计
8说了
展开代码
P1055 ISBN号码
8说了
展开代码
P1308 统计单词数
8说了
展开代码
P2010 回文日期
只要枚举年份即可,反转前四位构成回文串再判断日期是否合法。
展开代码
P1012 拼数
自定义排序。
展开代码
P5587 打字练习
坑的一批,范文也有退格
展开代码
Part 1.4 函数,递归及递推
P1028 数的计算
记搜
展开代码
P1036 选数
写麻烦了,本来想降一下复杂度的。
展开代码
P1464 Function
记忆化搜索
展开代码
P5534 【XR-3】等差数列
公式
展开代码
P1192 台阶问题
类似于斐波那契
展开代码
P1025 数的划分
dfs直接爆搜 or dp做
这题dp做还是很有意思的。数据增强版在这U101024 数的划分(数据加强版)
dfs爆搜解法
我们考虑dp解法。那么原题目分数字其实可以转换为$n$个球要放进$k$个盒子,但是不能有空盒的方案数。
那么我们考虑$dp[i][j]$代表把$i$个球放入$j$个盒子,且不空盒的方案数
那么要不空盒,朴素的思想就是先取$j$个球在每个盒子中都放入一个,然后再把剩下的$i-j$个球放入$j$个盒子
那么显然有:
\[dp[i][j] = \sum_{k=1}^j dp[i-j][k]\]
这样子需要分别枚举$i,j,k$,时间复杂度为$O(nk^2)$
注意在枚举的时候要保证$i>=j$,不然没法分。
代码如下
O(n*k*k)解法dp
但是其实还可以进一步优化到时间复杂度为$O(nk)$
对于上述转移方程我们考虑:
\[dp[i-1][j-1] = \sum_{k=1}^{j-1} dp[i-j][k]\]
等式右半之所以还是$i-j$是因为$(i-1) - (j-1) = i-j$
不难发现$dp[i][j]$和$dp[i-1][j-1]$只差了一项$dp[i-j][j]$
那么转移方程可以改写为:
\[dp[i][j] = dp[i-1][j-1] + dp[i-j][j]\]
此时只需要两层循环即可。
O(n*k)解法dp
但是对于强化版本的U101024 数的划分(数据加强版)我们还需要进一步优化空间复杂度才行。
其实因为k最大=600,所以每次更新dp数组只需要前面600个状态即可,这里考虑滚动数组来优化空间。
O(n*k)时间,O(k*k)空间解法dp
P4994 终于结束的起点
因为斐波那契循环节$<=6n$,所以暴力即可。
展开代码
本站总访客数人次