![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
信息学奥赛
文章平均质量分 77
Zsprinkle
这个作者很懒,什么都没留下…
展开
-
信息学奥赛第二十一节 —— 动态规划2(动态规划练习:取数 + LIS模型练习:合唱队形求解)
动态规划练习:取数(原题链接)题目描述设有N 个正整数(1 <= N <= 50),其中每一个均是大于等于1、小于等于300的数。从这N个数中任取出若干个数(不能取相邻的数),要求得到一种取法,使得到的和为最大。例如:当N=5时,有5个数分别为:13,18,28,45,21此时,有许多种取法,如: 13,28,21 和为6213, 45 和为5818,45 和为63……….和为63应该是满足要求的一种取法输入第一行是一个整数N第二行有N个符合条件的整数。输出原创 2022-05-26 17:16:48 · 1358 阅读 · 1 评论 -
信息学奥赛第二十节 —— 动态规划2(最大连续部分和 + 最长不下降子序列LIS)
最大连续部分和(原题链接)题目描述有n个整数(1≤n≤100),排成一排,例如n=7-2 13 12 9 14 -10 2 (7个整数)其最大的部分和为 48 (即 13+12+9+14)输入第一行一个整数 n第二行n个整数(-100≤xi≤100)数之间有一个空格;其中xi有正数输出一个整数(即最大的连续的部分和)样例输入7-2 13 12 9 14 -10 2样例输出48提示【来源】 2014江苏省青少年信息学奥林匹克竞赛复赛解题思路1:暴力原创 2022-05-24 12:08:29 · 1159 阅读 · 1 评论 -
信息学奥赛第十九节 —— 动态规划初步
概念多阶段决策问题:对于某一类活动,可以分为若干个相互联系的阶段,每个阶段都需要做出决策,采取一定的措施,这个阶段的决策确定之后,会影响到下一个阶段。每一个阶段的决策构成了一个决策序列,称为策略。每个阶段都有几个决策可以选择,从而就有很多个策略可以选择,在所有可以选择的策略中选取一个最优的策略,可以达到我们预定的效果。动态规划就是解决多阶段决策问题最优的通用方法。利用最短路径问题理解多阶段决策在上图中,如果想求A到E的最短路径,在这个过程中,涉及了A——>B、B——>C、C——>原创 2022-05-23 17:09:50 · 545 阅读 · 0 评论 -
信息学奥赛第十八节 —— 优先队列(priority_queue)
优先队列的分类大根堆或大顶堆(队头元素保持最大,默认)小根堆或小顶堆(队头元素保持最小)使用的场景以及时间复杂度优先队列用第三个参数来指定排序规则(参考下面代码),队列内部不是完全有序的,它只可以保证队头元素一直是最大或最小的。优先队列一般用于需要不停地从一堆元素中取走最大或最小的元素的场景。优先队列的效率较高,从其中删除元素、向其中插入元素的时间复杂度都是O(logn)。优先队列的基本操作(存储与遍历)需要注意的是,大顶堆默认使用的是less比较器,而不是greater比较器#inclu原创 2022-05-23 11:32:27 · 291 阅读 · 0 评论 -
信息学奥赛第十七节 —— 栈与队列(stack、queue)
栈 —— stack一个先进后出(First In Last Out)的数据结构。或者说是一个后进先出(Last In First Out)的数据结构。什么是先进后出?比如如果给定入栈顺序为1、2、3、4,那么,出栈顺序可能是1、2、3、4或者2、1、3、4。(也可能有其他的出栈顺序)栈的常用函数push() —— 向栈顶增加一个元素pop() —— 删除栈顶元素top() —— 取出栈顶元素size() —— 栈中元素的个数empty() —— 判断栈是否为空栈的基本操作#i原创 2022-05-16 16:56:43 · 843 阅读 · 0 评论 -
信息学奥赛第十六节 —— MAP映射
MAP —— 映射入门map中的元素分为两个部分:关键字(key)。每个关键字只能出现一次。值(val)即键值对。在map中,元素按照关键字进行排序,因此,我们不能直接修改map容器中的关键字,且map中不允许多个元素的关键字相同。(相比之下,在multimap中,可以出现多个相同的键)MAP的作用:顾名思义,map的作用是将一种类型的数据映射为另一种类型的数据。如:map<string,int> m1;可以将string映射成intmap<double,int>原创 2022-05-13 16:54:41 · 754 阅读 · 0 评论 -
信息学奥赛第十五节 —— SET集合与重载运算符
SET的性质、特点set是一个集合,且集合内的元素有序,除此之外,集合中不允许有重复的元素(multiset中的元素可以重复)。set中的元素不可以直接修改。那么,如果要修改集合中的元素,应该如何操作?答:先删除,再插入新的元素,效果等同于修改了旧的元素greater比较器与less比较器set中的元素之所以默认从小到大排序,是因为其默认使用的是less比较器。在编写代码时重载比较器,就可以使set中的元素默认为从大到小排序。需要注意的是,如果将默认的less比较器修改为了greater比较器,原创 2022-05-11 16:23:21 · 665 阅读 · 0 评论 -
信息学奥赛第十四节 —— LIST链表
LIST的结构list:链表。与vector与deque不同,它不要求计算机申请一片连续的空间。每个list都是由若干个结点构成的,而每个结点也包括三个部分:存储的元素指向前一个结点的指针指向后一个结点的指针list没有下标,因此需要使用迭代器进行访问。list不支持sort,但是其支持sort成员函数。算法来源于生活,链表的结构,与灯笼类似。LIST的一些函数remove(val) —— 删除与val相等的所有元素empty() —— 判断链表是否为空reverse() ——原创 2022-05-11 15:05:32 · 1528 阅读 · 0 评论 -
信息学奥赛第十三节 —— 双端队列deque
双端队列DEQUEdeque又叫双端队列,它支持随机访问迭代器。与普通的队列不同,双端队列可以在队首增加和删除元素,也可以在对尾增加和删除元素,不必再遵循队首出队、队尾入队的原则。双端队列与vector的区别缺点:deque存储元素的速度比vector快一些。因为它们两都是可变长的,实现可变长的方法是倍增(什么是倍增思想?如:长度变为当前容器内元素个数的2倍)。但是,vector只需要在一端改变,而deque需要向两端增加长度,操作变多,因此速度稍慢一些。优点:使用vector存储元素时,当遇到在原创 2022-05-10 16:56:12 · 658 阅读 · 0 评论 -
信息学奥赛第十二节 —— vector解决排序、vector解决约瑟夫问题、迭代器
复习vector —— 原题链接题目描述给定N个数组,要求先对这N个数组分别进行排序,然后再根据N的数组的字典序对这N个数组进行排序。输出排序的结果。输入第一行一个整数N,表示数组数。接下来N(N≤1000)行,每一行先包含一个整数C(C≤1000),表示数组的大小,接下来C个整数,表示数组中的一个元素。输出共N行,每行表示一个数组。样例输入41 31 12 2 13 2 3 1AC代码:#include <vector>#include <原创 2022-04-26 17:23:20 · 1289 阅读 · 1 评论 -
信息学奥赛第十一节 —— STL、vector的基本操作(一维与二维vector)
vector的入门概念STL:标准模板库(一些容器的集合)容器:用来管理一类对象的集合。可以说数组也是一个容器。常见的容器:向量、栈、队列、优先队列、链表、集合、映射迭代器:用来遍历对象集合的元素,或者说迭代器是用来遍历容器中元素的工具。需要注意的是并不是所有的容器都支持迭代器,例如需要遵循先进后出原则的栈就不支持迭代器。概念:vector是一个顺序的容器,能够存放各种类型的对象。可以将其理解为一个能存放任意类型的动态数组(可变长的数组)。vector的初始化:vector():创建一个原创 2022-04-24 16:52:22 · 1478 阅读 · 0 评论 -
信息学奥赛第十节 —— 贪心算法(渡河问题POJ 1700 Crossing River + 拦截导弹的系统数量求解)
复习概念贪心算法又叫贪婪算法,是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,贪心算法不从整体最优上加以考虑,它所做出的是在某种意义上的局部最优解。无后效性:贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。贪心算法使用的前提:局部最优解一定能导致全局最优解。贪心算法的过程建立数学模型来描述问题把求解的问题分成若干个子问题对每一子问题求解,得到子问题的局部最优解把子问题的局原创 2022-04-21 11:51:43 · 1442 阅读 · 1 评论 -
信息学奥赛第九节 —— 贪心算法(需要安排几位师傅加工零件 + 排队打水问题)
贪心算法的特点对于问题求解时,总是做出在当前来看是最好的选择的策略,即贪心算法不从整体来考虑问题。贪心算法与排序、高精度、背包等算法不同,没有一个特定的模板来表达贪心算法的过程。贪心的步骤抽象出题目的数学模型把需要解决的问题分解为许多个小问题选择一个策略,这个策略对于解决所有的小问题一定是通用的证明所选择的策略一定适用于所有的情况把子问题的解合并,就得到了全局的最优解贪心的证明反证法数学归纳法决策的包容性范围的缩放邻项交换法贪心的入门模型如图所示,在上图中,最外面的方原创 2022-04-20 16:23:40 · 2183 阅读 · 0 评论 -
信息学奥赛第八节 —— 高精度练习
高精度练习1原题链接题目描述求2的n次方!(0<=n<=100)输入从键盘读入一个整数n输出请输出2的n次方样例输入100样例输出1267650600228229401496703205376骗分代码:#include <algorithm>#include <iostream>#include <cstring>#include <string>using namespace std;i原创 2022-04-20 11:48:52 · 381 阅读 · 0 评论 -
信息学奥赛第七节 —— 高精度模板(高精度除法)
高精度除以低精度(大数除以小数)以4567 / 23 = 198 ... 13为例,在数学上,除法运算的过程如下:不难发现,除法是一个逐位试商的过程,在整个除法的过程中,需要不断地求商、求余。另外,与高精度加法、减法、乘法不同的是,在高精度除法中,不需要逆序存储输入的数据。因为在试商的时候,被除数要从最高位开始试起,所以不需要转置存储。高精度除法模板(高精度/大数除以低精度/小数)#include <algorithm>#include <iostream>#inc原创 2022-04-18 15:11:25 · 633 阅读 · 0 评论 -
信息学奥赛第六节 —— 高精度模板(高精度加法、减法乘法)
高精度算法出现的原因当参与运算的数的范围大大的超出了标准数据类型,如int(-2147483648 ~ 2147483647)或者long long的范围,就需要使用高精度算法来进行数的运算。高精度运算的特点是代码长度比较长,本质是对数学运算过程的模拟。既然不能使用标准数据类型,所以考虑使用字符串或者数组来存储这类大数据。常用的一些最大值符号0x7f7f7f7f —— 比int的最大值小一点0x3f3f3f3f —— 比int的最大值的一半小一点INT_MAX —— int的最大值#incl原创 2022-04-15 11:00:42 · 1902 阅读 · 0 评论 -
信息学奥赛第五节 —— 字符串5【刷题篇】
字符串练习练习1 词组缩写解题思路:只需要找到每个单词的第一个字母,将其转化为大写字母即可。转化时,可以使用toupper函数。需要注意的是,输入的一行字符串中,可能出现首字母为空格的情况,故需要特判一下。AC代码:#include <algorithm>#include <iostream>#include <cstring>#include <string>using namespace std;int main(){ st原创 2022-04-05 23:03:19 · 495 阅读 · 0 评论 -
信息学奥赛第四节 —— 字符串4(stoi + to_string)
前言信息学竞赛是一个优中选优的竞赛,需要天分,需要运气,更需要努力。越坚持,越努力,可能也就幸运。把信息学竞赛当做是自己人生的一个关卡,利用这个竞赛来锻炼自己的心性,磨炼自己的意志,找到自己的兴趣所在,这才是信息学竞赛最宝贵的价值所在。原创 2022-04-05 20:17:31 · 1527 阅读 · 0 评论 -
信息学奥赛第三节 —— 字符串3(对字符串使用sort/reverse + isupper() + islower() + isdigit())
原创 2022-04-04 22:33:09 · 363 阅读 · 0 评论 -
信息学奥赛第二节 —— 字符串2(s.find() + s.substr() + s.erase() + s.insert() + s.replace())
前言接上次文章,以一道例题开始本文。本题需要读者自行了解一下什么是字典序。在这里简单介绍一下字典序的比较:hello > hell 、 hello < hellp练习1 原题链接题目描述编写程序,针对输入的N个不同的字符串,输出其中字典码最小的字符串。输入输入第一行给出正整数N;随后N行,每行给出一个长度小于80的非空字符串,其中不会出现换行符,空格,制表符。输出输出字典码最小的字符串样例输入5LiWangZhaJinXian样例输出Jin原创 2022-04-04 19:16:22 · 1756 阅读 · 0 评论 -
信息学奥赛第一节——字符串1(字符串的读取 + size函数 + 下标的使用)
字符串string类string是C++中STL标准模板库提供的字符串类,用来处理字符串相关的问题其实,字符串的本质依然是字符数组。只不过string是长度不固定的,或者说是长度不限的字符数组。在使用string类的时候,不要先定义长度,如char c[100]先定义一个字符数组cchar c[100];//c[0] == *c字符数组相关的函数比较少,string集成了很多的函数字符数组的本质是数组,故其不能直接进行比较或者拼接运算。string可以直接进行比较原创 2022-04-03 22:05:02 · 1390 阅读 · 0 评论