线上OJ:【01NOIP普及组】数的计数核心思想:1、样例中给到了 f[6] = 6。其实这里包含了 f[3]=2, f[2]=2, f[1]=1, 以及6本身。注解:按照题意,6前面的数字只能是3,2,1,或者不放(不放就是6本身) 当6前面放3的时候,那3有多少种可能性,就都可以叠加在这里。即 f[6] += f[3] 同理,当6前面放2的时候,2的所有可能性也都叠加在这里 f[6] += f
线上OJ:线上OJ: 【01NOIP普及组】求先序排列核心思想:1、先构建二叉树,再按照要求输出 2、构建的方法,可以使用字符数组,也可以使用字符串 3、构建树的核心是:通过递归,根据后序遍历和中序遍历构建树 第一步、后序遍历的最后一个一定是根 第二步、在中序遍历中找到根 第三步、根左侧的都为左子树,右侧的都为右子树。对左子树和右子树分别再次递归传入参数说明: int left_pos, int
线上OJ:【01NOIP普及组】装箱问题核心思想:step1、要求箱子的剩余空间为最小,即要求 箱子内体积最大 step2、本题没有提到价值w,但我们可将每个物品的体积 v 等价于每个物品的价值w。 step3、所以箱内物品的体积和最大,即为箱内物品的总价值最大。 此时直接套用01背包模板代码即可题解代码:#include <bits/stdc++.h> using namespac
线上OJ:【02NOIP普及组】级数求和核心算法:暴力模拟备注:此类题,考场上也可以考虑 打表题解代码:#include <bits/stdc++.h> using namespace std; int k, n = 0; double s = 0; int main() { scanf("%d", &k); while(s <= k) {
线上OJ:【02NOIP普及组】选数核心思想:1、使用 模板函数 isPrime() 来判断一个数是否为素数。 2、定义一个函数 dfs 来进行深度优先搜索。在dfs函数中,通过递归的方式遍历所有可能的组合,并计算每个组合的和。在 dfs 中: 如果坐标 id 超过n,则越界,返回。 如果已选了k个数,且和正好为素数,则 ans 加 1。 否则,就对剩余的 [id+1, n] 个数继续进行枚举深搜
线上OJ 地址:【02NOIP普及组】过河卒核心思想:对于此类棋盘问题,一般可以考虑 dp动态规划、dfs深搜 和 bfs广搜。解法一:dp动态规划方法:从起点开始逐步计算到达每个位置的路径数。对于每个位置,它的路径数 等于 左边和上边位置的路径数之和(如果存在的话),同时要考虑到不能走被禁止的位置。状态转移方程: 状态初始化:第0行只能从左边转移过来; 第0列只能从上面转移过来; dp[0][0
线上OJ 地址:【03NOIP普及组】数字游戏此题考察的是 区间DP + 前缀和核心思想:1、这道题主要考查了动态规划的思想。通过分析题目,可以发现需要 枚举环上所有划分为m组 的不同方案,来求得最大或最小值。属于 环上动态规划 问题,可以 破环成链,变成区间dp问题。备注:环形 结构上的动态规划问题,是一种特殊的区间动态规划问题。由于存在 环形后效性,所以 不满足动态规划算法 的 无后效性 约束
线上OJ 地址:【03NOIP普及组】栈核心思想1、这类题目和火车进站出站是同一类问题,常规解法有两种。一、动态规划;二、卡特兰公式解法一:动态规划1、设 f[i][j]: i表示进栈的个数,j表示“进栈的i个”中出栈的个数。所以 j≤i举例: f[1][0]=1:进栈1个元素,出栈0个元素。此时只有1种可能,就是进栈的唯一元素不动。 f[1][1]=1:进栈1个元素,出栈1个元素。此时只有1种
线上OJ 地址:【03NOIP普及组】麦森数本题和 2007NOIP普及组真题 4. Hanoi双塔问题 本质相同,都是求 。Hanoi 塔的数据量还不算大,N只会取到200,所以在使用高精度时可以用字符串乘法。但本题麦森数的N会达到3100000,如果使用字符串乘法,复杂度会为 ,会超时。 所以本题需要使用 快速幂 和 高精度x高精度核心思想:快速幂 + 高精度1、本题是快速幂 + 高精度*高精
线上OJ:【04NOIP普及组】花生采摘核心思想:1、本题为贪心即可。 2、因为本题严格限制了顺序,所以先把每个节点的花生数量按降序排序。然后逐一判断下一个花生是否需要去采摘即可3、每一次采摘完,记录耗时 t 以及采集的花生总数 ans。同时考虑排序后的下一个节点,如果采摘后返回路边时间足够,则执行下一次采摘;如果采摘后来不及返回路边,则不再进行下一次采摘,本次直接返回路边即可。4、注意,第一次是
线上OJ:【04NOIP普及组】火星人核心思想:本题的难点是阅读理解。通读后发现,题目的本质是全排列,加上的数字 m ,起始就是调用 m 次 next_permutation() 。题解代码:#include <bits/stdc++.h> using namespace std; const int N = 10005; int n, m, a[N]; int main() {
线上OJ 地址:[04NOIP普及组] FBI树本题的意思是:给定一个 01字符串 (对应一棵完全二叉树的最后一层叶子节点),将树的每一个节点的值用字母“F、B、I”表示。规则(如下图所示)为: 1、如果树的左右子树的叶子节点都是0,则根节点为B; 2、如果树的左右子树的叶子节点都是1,则根节点为 I; 3、如果树的左右子树的叶子节点有0也有1,则根节点为 F;核心思想: 1、由于给出的字符串长度
线上OJ:[05NOIP普及组] 采药核心思想:1、题与 2006 年普及组第2题《开心的金明》一样,考察的都是01背包。 2、直接套用01背包的一阶模板即可a、限定时间看成背包总容量m b、每件物品的采药时间 v 看成占用背包的体积 c、每件物品的价格w作为该物品的价值 则本题可套用标准的01背包问题模板:for(int i = 0; i < n; i++) // n个物品供选择 {
线上OJ:【05NOIP普及组】循环核心思想:高精度 1、本题用到了标准的高精度乘法模板void init(int a[]) //传入一个数组 { string s; cin >> s; //读入字符串s a[0] = s.length(); //用a[0]计算字符串s的位数 for(i = 1; i <= a[0]; i++) a[
线上OJ:【06NOIP普及组】明明的随机数核心思想:本题的要求是 1、去重 2、排序 以上两个要求正好可以使用 set 来实现。set 自带了去重和排序的功能。输出时使用 iterator 即可。解法一、set#include <bits/stdc++.h> using namespace std; int n, x; set<int> s; int main() {
线上OJ:【06NOIP普及组】开心的金明本题只要把1、限定金额看成背包总容量 2、每件物品的价格 v 看成占用背包的体积 3、每件物品的价格v乘以权重w作为该物品的价值 则本题可套用标准的01背包问题模板:题解代码:#include <bits/stdc++.h> using namespace std; const int N = 30010; int n, m; int f[
线上OJ:【06NOIP普及组】数列思考:这道题大概率是一道可以使用“瞪眼法”找到规律的题目。我们尝试把数据补充的更多,以便于寻找规律 当 k=3 时,k的幂次为1, 3, 9, 27, 81......从上述推理中,我们发现要输出的幂次和中的第 N 项(也就是幂次和中的序号N),对应的二进制位数和幂次和对应的二进制位数相同。举例: N=7时,7 的二进制是 ,即第0位,第1位,第2位均为1, 。
线上OJ:【06NOIP普及组】Jam的计数法这又是一道思考30分钟,打码5分钟的题关键语句:1、每个字母互不相同,(即字母不能重复出现) 规则① 2、而且从左到右是严格递增的(举例,只能是 bdfij,不能是 bdfji) 规则② 3、隐藏条件:'a' 对应的数字是1,'b'对应的数字是2核心思想:1、如果用字母思考有点绕,我们可以先转换成数字来推理 举例样例输入的(s=2, t=10, w
线上OJ:【07NOIP普及组】Hanoi双塔问题题解分析1、本题考的其实不是Hanoi塔,而是瞪眼法(数学推导)和高精度。 2、本题不需要输出移动的顺序,只是输出移动的次数即可。核心思想:1、从上述图中,我们可以推导出:; 2、由于本题是双塔,每个圆盘有两个,所以Step2的第 i+1 个要移动两次,即 ① 3、由 ① 式已经可以直接写代码完成。但我们仍可继续简化公式。 4、根据 ① 式,我
线上OJ:【07NOIP普及组】守望者的逃离核心思想:1、闪烁耗费1秒,可以增加距离60米,但是恢复10点魔法值还需要2.5秒,所以闪烁的平均速度为 60m/3.5s = 17.14m/s > 跑步的速度17m/s。所以在时间充足的情况下,闪烁比跑步距离更远。2、但是如果最后剩余的时间不足以支持一次闪烁,则跑步能增加距离。3、所以,先按照最快的闪烁,计算每一秒钟能出现的位置(闪烁的秒,位置+
线上OJ:【07NOIP普及组】纪念品分组核心思想:核心语句是“每组最多只能包括两件纪念品”,所以本题不需要使用背包,可以直接贪心。第一步、升序排序第二步、每一次从两端取数:大的一定放在组里,小的是否放需要分析总和是否超过w第三步、两端端点向中间移动,直到两端点相遇题解代码:#include <bits/stdc++.h> using namespace std; const int
线上OJ:【07NOIP普及组】奖学金核心思想:1、用一个结构体存储学生的信息2、单独写一个快排使用的 cmp 函数题解代码:#include <bits/stdc++.h> using namespace std; const int N = 305; struct Node { int ch, ma, en, sum, id; // ch语文,ma数学,en英语,su
线上OJ:1392:繁忙的都市(city)核心思想:本题本质是最小生成树,可以采用 Prim 和 Kruskal 算法来解。解法一、PrimPrim 算法:蓝白点阶段0:初始化(minv[], vis[], minv[1])阶段1:在剩余蓝点中找出 minv 最小的点 k阶段2:由于k点是新加入的白点,所以要更新剩余蓝点到白点的 minv,以备下一轮使用#include <bits/stdc
线上OJ:【例4-11】最短网络(agrinet)算法描述:(使用 Kruskal 方法求最小生成树)1、初始化并查集。p[x]=x。 2、初始化输出结果ans=0 3、将所有边从小到大排序(sort)。 4、计数器 k=0,记载当前找到几条边; 5、核心代码如下for (i=1; i<=cnt; i++) // cnt为边的数量。循环所有已从小到大排
线上OJ:一本通:1386:打击犯罪(black)核心思想:1、如果按照题意,从1~k的顺序进行删除(枚举),则每次枚举完都要重置并查集,比较麻烦。2、考虑逆向思维, 不从1 ~ k 顺序删除,而是从 n ~ k 逆序往图中添加。a. 如果添加到 k 时,最大集合的元素数量不超过 n/2 ,则说明k还可以继续减小b. 如果添加到 k 时,最大集合的元素数量开始超过 n/2,则这个&nbs
线上OJ:1385:团伙(group)核心思想:1、朋友的朋友就是朋友。这句话意味着朋友之间直接合并。2、敌人的敌人就是朋友。这句话说明,如果 a 和 b 是敌人,a 和 c 也是敌人,则 c 和 b 就是朋友。如果 a 和 d 也是敌人,则 d 和 {c, b} 都是朋友。2.1 所以当 a 和 x 是敌人时,把 x 和 a 的敌人 合并即可。用一个数组
线上OJ:1944【08NOIP普及组】传球游戏核心思想:解法一、这类题可采用动态规划的思想。令 dp[i][j] 表示(从1号开始)经过 j 次传球后,球在i号手里的方案总数。由于球可以从前后两个方向传来,所以 。即:第 i 个点 j 次的方案总数等于前后两个点 j-1 次的方案数总和。#include <bits/stdc++.h> using namespace std
线上OJ:【08NOIP普及组】排座椅核心思想:1、假设第 i 行和第 i+1 行之间有 2 组交头接耳的学生对,则 row[i] = 2,表示第i行 和第i+1行有2组;2、假设第 i 列和第 i+1 列之间有 5 组交头接耳的学生对,则 col[i] = 5,表示第i列 和第i+1列有5组;3、所以,在读入每一行交头接耳的数据时(共 d 对数据),如果是在同一行,则更新row[i];如果是在同
线上OJ:1942:【08NOIP普及组】ISBN号码核心思想:简单模拟即可。1、一次性读入字符串,将每一个字符单独转换为数字处理2、如果读入的是数字,则 (s[j] - '0') 转换为数字。并 sum += 数字 * i++3、如果读入的是 '-',则跳过找下一个数字4、sum 完成后,对11取模作为识别码(sbm)5、如果 sbm 为个位数字,则将其转为字符,并比较ISBN的最后一
线上OJ:一本通-1977:【08NOIP普及组】立体图核心思想:本题采用模拟方法一个一个画小方块(虽然画的是立体空间的积木,但本质还是在二维平面上画图形)本题的难点在于:1、如何确定二维平面画布的大小(画布的高 h 对应二维平面的行向量,画布宽度L对应二维平面的列向量)2、如何确定每个积木的起点坐标 ( 左下角作为起点)3、如何处理遮挡观察难点1(如下图): 答:我
Copyright © 2005-2025 51CTO.COM 版权所有 京ICP证060544号