oi
Nickqw
No pains,no gains.
展开
-
noip2019普及组 公交换乘
题目公交换乘算法(滑动窗口,队列) O(45n)O(45n)O(45n)这道题目有个限制很重要:不会有两次乘车记录出现在同一分钟这就说明对于每个公交车来说,所能使用的优惠券不会超过45张。即我们可以完美避开各种复杂的数据结构优化了。因此我们可以从前往后扫描每条记录,同时用一个队列维护当前车次可以使用的优惠券区间:如果当前记录是火车,则加入维护的优惠券区间;如果当前记录是公...原创 2019-12-01 21:28:09 · 2234 阅读 · 0 评论 -
noip2019普及组 数字游戏
题目数字游戏算法(模拟,字符串处理) O(1)O(1)O(1)读入字符串,然后依次判断每个字符是否是 ‘1’ 即可。时间复杂度字符串长度固定为8,每个字符只会被遍历一次,所以时间复杂度是 O(1)O(1)O(1) 。C++ 代码#include <cstdio>#include <cstring>#include <iostream>#i...原创 2019-12-01 21:12:15 · 901 阅读 · 0 评论 -
noip2005普及组 循环
题目循环算法(高精度,数学,数论,递推) O(10k3)O(10k^3)O(10k3)引理1: 前 k+1k+1k+1 位的所有循环节长度,一定是 前 kkk 位循环节长度的子集。证明:如果前 kkk 位都不相同,那么前 k+1k+1k+1 位一定也不相同。引理2: 假设最小循环节长度是 ttt,那么所有循环节长度一定都是 ttt 的整数倍。证明:假设有循环节长度 ...原创 2019-11-21 10:18:26 · 615 阅读 · 0 评论 -
noip2005普及组 采药
题目采药算法(DP,背包问题) O(nm)O(nm)O(nm)经典01背包问题。采药总时间相当于背包容量,每一株药相当于一件物品,采药时间相当于该物品的体积,草药的价值相当于物品价值。时间复杂度01背包问题的时间复杂度等于 物品数量 × 背包容量,因此本题的时间复杂度是 O(nm)O(nm)O(nm)。C++ 代码#include <cstdio>#include...原创 2019-11-21 09:56:38 · 892 阅读 · 0 评论 -
noip2005普及组 校门外的树
题目校门外的树算法1(模拟,数组遍历) O(ML)O(ML)O(ML)定义一个长度为 L+1L+1 的布尔数组,表示每棵树的状态。true 表示已经被移走;false 表示未被移走。对于每次移动树木的操作 [Li,Ri][L_i,R_i][Li,Ri],直接循环一遍,将布尔数组中从 LiL_iLi,到 RiR_iRi 这段赋值为true。最后统计值为 false 的数...原创 2019-11-20 10:01:46 · 367 阅读 · 0 评论 -
noip2005普及组 陶陶摘苹果
题目陶陶摘苹果算法(模拟,枚举) O(n)O(n)O(n)依次枚举每个苹果,判断陶陶的身高加上凳子的高度,是否大于等于苹果的高度即可。时间复杂度分析对每个苹果枚举一次,因此时间复杂度是 O(n)O(n)O(n),其中 nnn 是苹果数量。C++代码#include <cstdio>#include <cstring>#include <iostr...原创 2019-11-20 09:43:35 · 454 阅读 · 0 评论 -
noip2004普及组 火星人
题目火星人算法(贪心,全排列) O(nm)O(nm)O(nm)这道题目可以直接用next_permutation函数来做。这里我们考虑一下next_permutation函数的原理,然后手动实现一遍。对于给定的某个排列,我们想求出比它大的最小的排列。可以从后往前遍历这个排列,找到第一个可以让排列的字典序变大的位置。只有当序列单调下降时,它才不存在更大的排列,因此我们要找的位置就是...原创 2019-11-19 10:40:14 · 592 阅读 · 0 评论 -
noip2004普及组 FBI树
题目FBI树算法(递归,二叉树) O((N+1)2N)O((N+1)2^N)O((N+1)2N)对于样例来说,我们可以得到如下所示的满二叉树:可以递归处理整棵树,我们发现当输入字符串固定时,整棵树也就固定了,因此可以将字符串当做递归函数传入的参数。由于要输出后序遍历,因此需要先输出左子树和右子树,再输出当前节点的信息。从图中可以发现,左子树所对应的字符串即是当前字符串的前半段,右...原创 2019-11-19 10:19:11 · 386 阅读 · 0 评论 -
noip2004普及组 采摘花生
题目采摘花生算法(模拟) O(M2N2)O(M^2N^2)O(M2N2)由于题目中描述:“你先找出花生最多的植株,去采摘它的花生;然后再找 出剩下的植株里花生最多的,去采摘它的花生;依此类推,不过你一定要在我限定的时间内回到路边。”并且:可能只有部分植株下面长有花生,假设这些植株下的花生个数各不相同。因此整个采摘花生的过程是确定的,没有选择的余地,所以这道题目是一道模拟题...原创 2019-11-18 10:50:08 · 999 阅读 · 0 评论 -
noip2004普及组 不高兴的津津
题目不高兴的津津算法(模拟,枚举) O(n)O(n)O(n)枚举每一天,算出在校学习和在家学习的总时间的最大值。然后判断最大值是否大于8:如果最大值大于8,则输出那一天的编号;否则津津每天都会很开心,输出0.时间复杂度分析对每天处理一次,所以时间复杂度是 O(n)O(n)O(n),其中 nnn 是总天数。C++ 代码#include <cstdio>#in...原创 2019-11-18 10:25:58 · 348 阅读 · 0 评论 -
noip2003普及组 麦森数
题目麦森数算法(高精度,快速幂,数学) O(5002logP)O(500^2logP)O(5002logP)首先考虑如何求位数。我们发现在 10k∼10k+1−110^k∼10^{k+1}−110k∼10k+1−1,(k≥0)(k≥0)(k≥0)之间的数均有 k+1k+1k+1 位。因此对于任意正整数 xxx,它的位数是 ⌊log10x⌋+1⌊log10x⌋+1⌊log10x⌋+1。而...原创 2019-11-06 09:40:39 · 301 阅读 · 0 评论 -
noip2003普及组 栈
题目栈算法(组合计数,卡特兰数) O(n2)O(n^2)O(n2)首先任何一种合法的入栈、出栈操作序列都可以得到一个不同的1~n的排列,因此可以得到的排列总数等于合法入栈、出栈操作序列的个数。该问题等价于求第NNN项CatalanCatalanCatalan数。时间复杂度在本题中我们使用公式 Cnm=Cn−1m+Cn−1m−1C_n^m=C_{n-1}^m+C_{n−1}^{m−1...原创 2019-11-03 20:51:17 · 588 阅读 · 0 评论 -
noip2003普及组 数字游戏
题目数字游戏算法(DP,区间DP) O(n3m)O(n^3m)O(n3m)首先将环从起点处断开,然后复制一遍接在后面,这样原问题就转化成了线段型的模型。然后从集合角度来分析状态表示和状态计算:状态表示:f[l][r][i],表示所有将 a[l…r] 分割成 i 部分的方案的最大乘积;g[l][r][i] ,表示所有将 a[l…r] 分割成 i 部分的方案的最小乘积;状态计算:...原创 2019-10-30 17:12:56 · 694 阅读 · 0 评论 -
noip2003普及组 乒乓球
题目乒乓球算法(字符串处理,模拟) O(n)O(n)O(n)先将整个比赛情况读取进来,然后依次枚举在11分制和21分制下的比赛结果即可。在11分制下,一局比赛结束的条件是:某一方达到11分,且分差达到2;在21分制下,一局比赛结束的条件是:某一方达到21分,且分差达到2;注意最后如果比分是0:0,也要输出。时间复杂度每个字符处理一遍,因此时间复杂度是 O(n)O(n)O(n)...原创 2019-10-29 17:35:19 · 777 阅读 · 0 评论 -
求小于N的所有素数
筛法计算质数表 特点:能够快速筛选出区间 [2,N] 中的所有质数 算法: 在整数区间[2,N]内, ① 保留 2 同时去掉其他 2 的倍数, ② 保留 3 同时去掉其他 3 的倍数, ③ 保留 5 同时去掉其他 5 的倍数, ④ 保留 7 同时去掉其他的倍数,……,以此类推,一直到所有小于 N 的质数的倍数都被去掉,剩余的数字就是质数表 筛法计算质数表实例 求出2到20之...原创 2018-09-17 02:43:25 · 4206 阅读 · 0 评论