三年级,想让孩子一年速通CSP-J靠谱吗?

今年虽是三年级,但已经超前学习到五年级的数学知识了,跟线下老师说希望能一年速通CSP-J,但线下老师认为至少两年。 大家好,我是大李,这个问题来自公众号粉丝留言。 我先说下自己的看法,如果大家觉得有更好的建议,欢迎大家留言,求同存异。 首先我觉得三年级学信奥起步就算是比较早的了,而且现在还是三年级上学期。但考虑到此学生已经掌握了五年级的数学知识,倒是可以尝试下。 对于CSP-J中所涉及到的数学知识

文件操作

NOI系列赛事的提交,需要以文件的形势提交,如果之前没有了解过,那肯定会爆0,具体是怎么操作呢? 其实非常简单,只需添加输入输出文件的两行代码即可,也可以多添加两行关闭输入输出文件   #include <iostream> using namespace std; int main() { //打开输入文件,输出文件 freopen("test.in","r",stdin)

[置顶]网站纪要及“食用”说明

欢迎大家来到《C++算法宝典》 目前正在更新中,由于由于排序问题,虽然几乎每天都在更新,但并不会置顶,如果有小伙伴觉得更新慢,可以随时催更!!! 在一个吉利的日子,搭建本教程网站。 截止到7月8日,共更新了38篇CSP-J阶段的知识,暂时还未涉及到提高组的算法知识,敬请期待~ 系统学习请点击分类,比如c++基础、基础算法、数据结构 想看下一个教程,请在文章底部点击上一篇「因为是按时间顺序排序的,进

数据结构01 栈及其应用

数据结构是一种在程序中系统化管理数据集合的形式。它通常由以下3个概念组合而成: 数据集合:通过对象数据的本体(例如数组和结构体)保存数据集合 规则:保证数据集合按照一定规矩进行正确操作、管理和保存的规则(例如按照顺序取出数据) 操作:增、删、改、查等对数据集合的操作 我们今天主要讲解的是栈(Stack)的操作 栈是一种线性数据结构,栈的特征是数据的插入和删除只能通过一端来实现,这一端称为“栈顶”,

数据结构02 队列及其应用

队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,前端一般叫做队头,后端叫队尾。队列就像学校做操站队一样,来的人一个一个往后站,走的时候从前往后一个一个走。 总结队列的特点为:先入先出,即先入队的元素先出队。 对于队列的使用,我们可以直接利用数组来模拟队列的基本操作,具体实现如下: int que;     //定义一个能存放10

数据结构03 链表及其操作

链表的种类较多,这里我们主要讲解最常见的带头结点的单链表。 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。   如图所示,链表中每个数据的存储都由以下两部分组成: 1.数据元素本身,其所在的区域称为数据域; 2.指向直接后继元素的指针,所在的区域称为指针域;   1.头结点:头节点是一个不存储任何数据的结点,是为了方便找到链表位置。 2.首元结点:它是链

数据结构04 动态数组vector

vector翻译为向量,但是这里使用“变长数组”的叫法更容易理解,也即“长度根据需要而自动改变的数组”。 在考试题中,有时会碰到只用普通数组会超内存的情况,这种情况使用vector会让问题的解决便捷许多。 另外, vector还可以用来以邻接表的方式储存图,这对无法使用邻接矩阵的题目(结点数太多)、又害怕使用指针实现邻接表的读者是非常友好的写法也非常简洁。   如果typename 是vector

数据结构05 链表list

由于链表的存储方式并不是连续的内存空间,因此链表list中的迭代器只支持前移和后移,属于双向迭代器   优点:采用动态存储分配,不会造成内存浪费和溢出。 链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素。 缺点:list链表遍历速度不快,同时占用空间大。 与vector容器相比,因为不用保持内存空间的连续性,所以list的插入删除更为方便快捷。但是list容器所占用的内存空间比ve

数据结构06 树与二叉树

树是一种非线性存储结构,存储的是具有“一对多”关系的数据元素的集合。 例如我们生活中的家族族谱、公司组织结构图等都是树结构。如下图所示,即为一棵树 。 下面我们根据上图来了解一下树的相关概念: 树的结点:使用树结构存储的每一个数据元素都被称为“结点”。例如,图中,数据元素 A 就是一个结点; 父结点(双亲结点)、子结点和兄弟结点:对于图中的结点 A、B、C、D 来说,A 是 B、C、D 结点的父结

算法01 递推算法

递推是一种处理问题的重要方法。 递推通过对问题的分析,找到问题相邻项之间的关系(递推式),从起点出发(首项或者末项)然后使用循环不断地迭代,得到最后需要的结果。 对于Fibonacci数列,已知:fib(1) = 1; fib(2) = 1; 从第三项开始满足公式fib(i) = fib(i-1) + fib(i-2)。输入一个整数n(1<=n<=100),求fib(n)的值。 【输入

算法02 递归算法

在编程中,我们把函数直接或者间接调用自身的过程叫做递归。 递归处理问题的过程是:通常把一个大型的复杂问题,转变成一个与原问题类似的,规模更小的问题来进行求解。 函数的参数。在用递归解决问题时,要合理地去设计函数的参数,达到当前问题与子问题之间的变化,可以通过参数进行准确地描述。 递推关系。要能够找到当前问题与子问题之间的联系,能够用子问题去描述当前问题的解。 递归出口(边界条件)。要找到问题的边界

算法03 模拟算法之一维数组相关内容详解

模拟算法就是模拟题目给的操作,用代码一步一步的描述出来即可。在过程中使用的都是我们已知的各种方法,如数组元素调用、排序、枚举等等,只是这些过程一般比较复杂。本次课程主要针对一维数组的模拟。 在各类算法竞赛中,包括CSP-J/S,NOIP等竞赛,经常会出现各类“模拟题目”,遇到这种题大家不需要害怕,甚至可以将其作为“送分题”,因为你只需要按照题目叙述的方式来写程序就能得到最终答案。模拟不是一种算法,

算法04 模拟算法之普通二维数组相关详解

直接来训练下普通二维数组的题目。 给定一个m行n列的矩阵,求矩阵外围元素之和。所谓矩阵外围的元素,是矩阵第一行、最后一行、第一列和最后一列的所有元素。 【输入描述】第1行:为两个整数,分别表示矩阵的行数m和列数n,中间以一个空格间隔; 接下来m行为该矩阵m行n列的元素,且都为整数,每一行元素之间以一个空格隔开。 【输出描述】一个整数,表示该矩阵外围元素之和。 【样例输入】 3 4 1 2 2 1

算法05 贪心算法

贪心算法(greedy algorithm),是用计算机来模拟一个「贪心」的人做出决策的过程。这个人十分贪婪,每一步行动总是按某种指标选取最优的操作。而且他目光短浅,总是只看眼前,并不考虑以后可能造成的影响。 可想而知,并不是所有的时候贪心法都能获得最优解,所以一般使用贪心法的时候,都要确保自己能证明其正确性。   贪心算法有两种证明方法:反证法和归纳法。一般情况下,一道题只会用到其中的

算法06 二分查找

二分查找又称为折半查找,主要用于查找一个有序数组中某一个数的位置。 主要思想如下: 在一个有序数组中,取数组的中间值与要查找的数进行比较; 若要查找的数等于中间值,查找成功。   若要查找的数大于中间值,则在右半区间继续取中间值与要查找的数进行比较; 若要查找的数小于中间值,则在左半区间继续取中间值与要查找的数进行比较; 直至最后要查找的数未出现过与中间值相等的情况,查找失败  

算法07 深度优先搜索

现在有一个3*3的迷宫,小知在迷宫的左上角,迷宫出口在右下角,请你帮小知算一算,他有多少种方案可以走出迷宫(每个格子不能重复走动)。 迷宫中显示0的点,是不可以走的。小知每次只能到达相邻的上下左右4个格子。 1.如果当前出发的格子是终点,则程序结束。 2.每次可以选择的格子有:上(A)、下(B)、左(C)、右(D)。 3.按照顺序尝试每个格子是否可走。 4.找到第一个可以走的格子(假设为B),标记

算法08 广度优先搜索

现在有一个4*4的迷宫,小知在迷宫的左上角,迷宫出口在右下角,小知体力有限,他希望尽快走出迷宫,请你告诉小知最少需要走多少步(每个格子不能重复走动)。 迷宫中显示0的点,是不可以走的。小知每次只能到达相邻的上下左右4个格子。 我们可以按照这样的思路去找: 从起点出发,检查第1步可以到达的所有点,判断是否为终点。 依次从第1步到达的点出发, 检查判断第2步可以到达的点是否为终点。 依次从第2步到达的

算法09 模拟算法之日期模拟

无论是中小学编程竞赛还是大学生编程竞赛,日期模拟都是经常会出现的题目。 日期模拟经常会出现以下题型: 得到某年某月的天数 判断给定日期的合法性 给定年份,求这一年第n天的日期 给定年月日,求经过n天后的日期 查找两个日期之间有多少个回文日期... ...   得到某年某月的天数问题经常会作为其他问题的模板来使用。 首先我们需要存储一年中所有月份相对应的天数 int day = {0,31,28

算法10 动态规划DP入门

动态规划是一种处理问题的算法思想,这些问题主要有以下特征: 问题可以按时间顺序分解成若干相互联系的阶段,在每个阶段都需要做出决策。 我们可以把当前的问题分解成若干个规模更小的子问题,当前问题的最优解,可以由子问题的最优解得到。 某阶段的状态一旦确定,则此后过程的演变不再受此前各种状态及决策的影响。 动态规划方法将问题分解为一组更简单的子问题,在求解每个子问题时,会将子问题的解保存起来,在后面遇到相

C++基础01 C++基本框架

C++语言,是基本的程序设计语言之一【程序设计语言,简单的来说就是编写代码来操控计算机实现某种功能的语言。】,有很多大家经常会玩的游戏都是有C++语言参与的,比如植物大战僵尸以及英雄联盟中的部分代码都用到了C++语言。 打开devcpp软件(点击此处获取devcpp编程软件)从主菜单选择“文件”—>“新建” —>“源代码”即可。新建完成之后屏幕右下侧出现一片白色区域,称为“源程序编辑区

C++基础02 输出语句与分隔

标准输出指令:cout 标准使用格式:cout << 指令功能:在控制台输出结果,如果想要原样输出我们想让他显示的内容,那么就需要将原样输出的内容用双引号引起来。 小知学习完cout语句之后,希望利用自己所学知识来告诉老师自己现在的位置在哪里?聪明的你能帮助小知完成这个简单的任务吗? 【样例输入】无 【样例输出】广东省深圳市 #include <iostream> usin

C++基础03 变量

变量,代表了一个存储单元,其中的数量是可以改变的 ,所以我们把它称为变量,通俗的说,变量就类似于一个房间,我们可以往房间里面放不同数量的椅子。 定义格式:变量类型  变量名; 变量类型也就是规定变量里能放什么类型的数据,比如整数,小数等等。 例如,现在需要定义一个能存放整数的变量,名字叫a,那么 这里可以写成:int a; 这里的int表示变量a里只能放整数数字。 定义多个变量:将多个变量名之间用

C++基础04 输入语句

使用格式:cin >> 输入的意思就是把一个值放到变量里面去,也就是变量的赋值,这个值是由我们自己输入的。 (注意:输入变量前要先定义,输入完之后要按Enter键。) 输入多个变量,与输出类似,用”>>”连接即可。 例:如果我要向定义好的整型变量a里面输入数字,则 可写成: cin>>a; 小知书架内的书总是被他借给别人,所以他也不能确定书架内还有多少本书,今天

C++基础05 浮点型/实数类型

实数类型是一种数据类型,实数类型变量里能存放小数和整数。 定义格式:double a; 赋值:a=0.4; 输入:cin>>a; 输出:cout<<a; 小知在文具店买铅笔,一枝铅笔的价格是0.8元。请你帮助小知,用变量的形式输出这枝铅笔的价格。 【样例输入】无 【样例输出】0.8 #include <iostream> using namespace std;

C++基础06 格式化输出

格式化输出所用的函数为 printf,它可以输出任意位数的小数。 使用格式:printf(“%.nf”,a)。这句话的作用是将变量a保留n位小数输出。 注意事项: 1、这里的n,需要具体化为一个数字,保留几位小数,如保留两位小数,n就改成2,保留三位小数,n就改成3; 2、%后面的小数点一定不能漏掉。 3、使用printf的时候,一定要注意加上头文件#include<cstdio>。