信息学奥赛一本通题解
文章平均质量分 63
信息学奥赛一本通OJ题解 http://ybt.ssoier.cn:8088/
君义_noip
五道口职业技术学院毕业
信息学奥赛教练
小说作者
展开
-
信息学奥赛一本通 1435:【例题3】曲线 | 洛谷 洛谷 P1883 函数
已知f(x),g(x)两个函数的较大值h(x)=max(f(x),g(x))是下凸函数,那么多个函数的最大值。【注】:r与l差值很小时结束循环,对于一般的结果保留几位小数的问题(比如保留5位,8位等),将差值取为。已知f(x),g(x)为下凸函数,证明h(x)=max(f(x),g(x))是一个下凸函数。在定义域[0,1000]中是下凸函数(单谷函数),因此可以使用三分求单谷函数的极小值点。,即为所有二次函数当自变量为x时的所有函数值的最大值。,所以所有的二次函数都是开口向上的,为下凸函数。原创 2023-11-17 14:39:43 · 678 阅读 · 0 评论 -
信息学奥赛一本通 2077:【21CSPJ普及组】小熊的果篮(fruit) | 洛谷 P7912 [CSP-J 2021] 小熊的果篮
交替在st0与st1中选择数字,下一次在另一个集合中选择出的数字要比上一次选择出的数字更大,并删除数字。如果当前fruit链表在删除数字后,成为空链表,那么需要在block链表中删除该空链表,并判断前一个链表和后一个链表的水果种类是否相同,如果相同,则合并两个单链表(即把后一个链表接到前一个链表的后面)。每次遍历block链表,在block链表中的每个“块”中(fruit链表)取第一个数字输出,并删除fruit链表中的第一个数字。创建一个block双向链表,block链表中的每个元素都是一个“块”。原创 2023-10-09 20:08:48 · 1160 阅读 · 0 评论 -
信息学奥赛一本通 2075:【21CSPJ普及组】插入排序(sort) | 洛谷 P7910 [CSP-J 2021] 插入排序
对于相同的数值,在原数组中下标更大的元素应该排在后面。对于相同的数值,在原数组中下标更小的元素应该排在前面。先根据题意,使用索引数组完成插入排序,注意交换元素时需要使用我们定义的。sa与as保存的就是原数组a与目标数组s之间的两个方向的映射关系。主函数中,首先输入a数组,初始状态下s数组与a数组相同,满足。假想存在排序后的目标数组s,设数组sa为索引数组,表示。开始,不断变大,向后遍历s数组,直到j为n-1。开始,不断变小,向前遍历s数组,直到j为2。在排序后的s数组中的下标,也就是。原创 2023-09-26 17:12:55 · 1070 阅读 · 1 评论 -
信息学奥赛一本通 2074:【21CSPJ普及组】分糖果(candy) | 洛谷 P7909 [CSP-J 2021] 分糖果
根据上述规律,x从l变化到r的过程中,x%n的值是逐渐增大的,当x为r时,x%n的值最大,为。这似乎是在做取模运算。,那么从l到r范围内一定存在一个数字x%n为n-1,一定存在一个数字x%n为0。其中,x%n的值每“段”从0变到n-1,都满足x/n的值是不变的。下图横轴为x,纵轴为x%n,L,R为满足该描述的一种可能的情况。下图横轴为x,纵轴为x%n,L,R为满足该描述的一种可能的情况。可以看到,x%n的值始终是从0变到n-1,再从0变到n-1。,x/n的值始终是m,而x%n的值从0变化到n-1。原创 2023-09-25 20:56:10 · 826 阅读 · 2 评论 -
信息学奥赛一本通 2086:【22CSPJ普及组】乘方(pow) | 洛谷 P8813 [CSP-J 2022] 乘方
设r为累乘乘积,初值为1。如果在循环求幂的过程中,若发现r大于。,可以使用long long类型保存该值。因此当a=1时,应该直接输出1。,则直接输出-1,而后结束程序。的数字相乘,结果不会超过。原创 2023-09-25 19:56:32 · 605 阅读 · 0 评论 -
信息学奥赛一本通 1984:【19CSPJ普及组】纪念品 | 洛谷 P5662 [CSP-J2019] 纪念品
结合购买纪念品的背景,每件商品可以购买无限件,因此在第i天买入商品,到第i+1天卖出所有商品,想要赚到最多的钱币,该问题实际是一个完全背包问题。到第二天,又可以卖出商品换钱了,因此只需要考虑商品在当天及第二天的差价,差价越高,今天买该商品,到第二天升值越多。由于小伟每天都可以买卖物品无限次,我们可以假想每天开始时,他把所有的商品都卖出,看用手中的钱该买哪些商品。原创 2023-08-19 12:17:50 · 953 阅读 · 0 评论 -
信息学奥赛一本通 ybt 1975:【16NOIP普及组】海港 | 洛谷 P2058 [NOIP2016 普及组] 海港
每条船为一个元素,包含属性vector类型的nation,保存所有人的国籍,以及time表示时间。设结构体Peo表示一个人,每个人包含属性:时间time、国籍nation。,这样可以节省空间。如果设为数组,则会内存超限。,可以把每个人作为一个元素保存在队列中。每次有船到岸,就输出一下国籍总数。每次有船到岸,就输出一下国籍总数。由于人数总和(即k的加和)最大为。注意:nation必须设为。表示第i国籍的人数。原创 2023-08-19 11:36:11 · 802 阅读 · 0 评论 -
信息学奥赛一本通 1352 【例4-13】奖金
拓扑排序的过程中,顶点u访问邻接点v,存在弧,v的奖金应该比u的奖金至少高1,应该用。因此可以这样定义边:如果b的奖金比a高,那么存在有向边。如果a奖金比b高,应该先确定b的奖金数,再确定a的奖金。统计算法进行过程中入度变为0的顶点数量num。图中入度为0的顶点的奖金为100。设数组money,顶点i的奖金为。原创 2023-04-15 00:27:02 · 1912 阅读 · 0 评论 -
信息学奥赛一本通 1385:团伙(group) | 洛谷 P1892 [BOI2003]团伙
也就是说一个人的所有敌人都互为朋友,同属于一个集合。,集合的数量就是fa数组中根结点的个数。每个人是一个元素,一个团伙是一个集合。并查集中每个集合的根结点满足。因此,设数组enemy,表示i的某一个敌人。最后输出集合的数量。原创 2023-04-14 15:30:29 · 1871 阅读 · 0 评论 -
信息学奥赛一本通 1523:嗅探器 | 洛谷 P5058 [ZJOI2004]嗅探器
首先不能考虑根结点是割点的情况,根结点st是蓝军信息中心,红军的嗅探器只能放在中间服务器上,不能放在信息中心。因此,如果可以在u处放嗅探器,信息中心ed必然应该在DFS生成树中的以割点u为根结点的子树中。假设合理的可以作为嗅探器的割点为u,删掉u后,st与ed必然存在于两个不同的连通分量。思考从顶点st(一个蓝军信息中心)出发,进行深搜,得到DFS生成树,树根是st。从顶点S出发,调用tarjan算法,求出图中的割点,判断该割点是否可以放嗅探器。求所有满足条件的可以放嗅探器的顶点的最小值,即为结果。原创 2023-04-07 21:19:17 · 967 阅读 · 0 评论 -
信息学奥赛一本通 1386:打击犯罪(black)
从一个空白的图开始,从顶点n到顶点1取每个顶点加入到图之中,针对每个顶点与图中已有顶点之间的边,进行合并操作。合并后只有该顶点所在的连通分量的数量发生了变化,因此只需要判断该连通分量中的顶点数是否大于n/2。“最大的犯罪团伙的危险程度不超过n/2”,即为顶点数量最多的连通分量的顶点数量小于等于n/2。按顺序打击团伙,相当于删掉当前图中的顶点,而后统计图中每个连通分量的顶点数量,这一过程过于繁琐。每个犯罪团伙是一个顶点,犯罪团伙之间的联系是边,每个犯罪集团是一个连通分量。原创 2023-04-02 00:37:29 · 2210 阅读 · 3 评论 -
信息学奥赛一本通 1374:铲雪车(snow)
铲雪车从起点出发,按照欧拉回路顺序走遍图中的每条边(车道),最后回到起点,可以完成铲雪。根据输入,使用两点间距离公式求出每条道路的长度,乘以2后就是所有车道(所有边)的总长度,除以行车速度,即可得到花费的总时间。所有的道路都是双车道,对于一条道路,铲雪车每次经过道路只能铲掉一侧的雪,需要来回走两趟才能完全清除这条道路上的雪。该图一定存在欧拉回路。该图是有向图,将每个路口视为顶点,每条车道是一条有向边,每条道路即为双向的有向边。要想完成对所有道路铲雪,也就是要把每条边都走一次,这是一个求欧拉路径的问题。原创 2023-04-01 01:15:26 · 2396 阅读 · 0 评论 -
信息学奥赛一本通 1347:【例4-8】格子游戏
学习并查集时,每个元素都由一个整数来表示。而该问题中每个元素是一个坐标点,由(x, y)两个整数构成。如果并查集中的元素不为整数,可以将fa数组改为映射(map类型),同时find、merge都发生改变。例:假设坐标点是2行3列的,每个位置的坐标为x, y,转变后的数字为d,记为(x, y):d。通过一个公式将二维坐标换算为一个整数,用这个整数代表该二维坐标。在输入时,使用find直接判断两个数对元素是否在一个集合中。每输入一个坐标(x,y),求出其对应的数字f。把每个坐标都用一个数字表示。原创 2023-04-01 00:47:46 · 6360 阅读 · 0 评论 -
信息学奥赛一本通 1375:骑马修栅栏(fence) | 洛谷 P2731 [USACO3.3]骑马修栅栏 Riding the Fences
从起始顶点出发,进行深搜,使用Hierholzer算法求欧拉路径。为了满足条件,必须按顶点编号从小到大访问一个顶点的所有邻接点。只需要在实现Hierholzer算法时,包括选择起始顶点或某顶点的邻接点时,尽量选择编号较小的顶点来访问即可。“两顶点间可能有多个栅栏”意味着可能有重边,但Hierholzer算法可以处理有重边或自环的图。“输出500进制表示法中最小的一个”,即为输出字典序最小的欧拉路径顶点序列。在输入边时,统计顶点编号的最大值,作为总顶点数量。该图是无向图,顶点就是图中的顶点,栅栏是边。原创 2023-04-01 00:29:50 · 2429 阅读 · 0 评论 -
信息学奥赛一本通 1341:【例题】一笔画问题
遍历选择起始顶点,如果v的度为奇数,那么选择该顶点为起始顶点。否则起始顶点默认为1号顶点。顶点数n最大为100,可以使用邻接矩阵或邻接表解决。求解欧拉回路使用Hierholzer算法。该题默认一定有欧拉路径或欧拉回路。使用Hierholzer算法可以在。的时间复杂度内求出欧拉回路。原创 2023-03-31 18:27:26 · 1757 阅读 · 0 评论 -
信息学奥赛一本通OJ勘误
更改描述:“每对成虫过x个月产y对卵”改为:“每对成虫过x个月后每个月产y对卵”尽管如此,该网站还是有一些错误,在此指明。瑕不掩瑜,希望网站作者早日修正。题目中概念错误,应该把所有的“逆波兰表达式”改为“波兰表达式”。应该添加Special Judge,但没有。1312:【例3.4】昆虫繁殖。1527:【例 1】欧拉回路。1198:逆波兰表达式。原创 2023-03-31 12:32:34 · 711 阅读 · 0 评论 -
信息学奥赛一本通 1384:珍珠(bead)
k, i, j三重循环,如果i到j的重量关系还没确定(每颗珍珠是一个顶点,初始情况下,如果i比j重,那么i到j有一条弧。为真,即i比j重,那么比i轻的珍珠的数量增加1,比j重的珍珠数量增加1。已知n是奇数,那么n/2(n整除2)的结果等于(n-1)/2。先输入已知的相对重量关系,如果输入了x,y,那么x比y重,将。),但是i比k重,k比j重,那么一定有i比j重。记录比j重的珍珠的数量。统计不可能是中间重量的珍珠的数量,输出结果。设布尔类型数组e,为该图的传递闭包,即。记录比i轻的珍珠的数量,原创 2023-03-28 17:15:55 · 1420 阅读 · 0 评论 -
信息学奥赛一本通 1388:家谱(gen) | 洛谷 P2814 家谱
每输入一个名字,都先检查一下name2Num中是否有以该名字为键的键值对(即该名字是否出现过),如果之前没出现过,则为该名字分配一个新的编号。而后该名字对应的编号为。每个人都是用一个整数来表示的,那么就可以用树的双勤表示法(也就是并查集中的fa数组)来表示所有人之间的关系。模仿并查集中的查询操作,写出find函数,求x的祖先。保存的键值对为(名字,编号)。保存的键值对为(编号,名字),可以将编号转为名字。设置将名字与整数互相转换的映射。表示名字为x的人的父亲的名字。为编号为x的人的父亲的编号。原创 2023-03-24 17:09:14 · 975 阅读 · 0 评论 -
信息学奥赛一本通 1383:刻录光盘(cdrom) | 洛谷 P2835 刻录光盘
资料分发的过程类似于深搜,如果一个顶点出发进行深搜,那么该顶点所在强连通分量中的顶点都会被访问到。即如果一个人收到资料,那么该人对应的顶点所在强连通分量中的所有顶点所表示的人都会收到资料。两种算法都是先求强连通分量,而后求每个强连通分量的入度,统计入度为0的强连通分量的数量即为需要分发的光盘数量。设并查集,每个集合表示图中的一棵子树,该子树有唯一的入度为0的根结点。将该图缩点,每个顶点代表一个强连通分量,求出每个强连通分量的入度。因此发放光盘的数量,就是将该图缩点后,入度为0的强连通分量的数量。原创 2023-03-15 01:28:48 · 1936 阅读 · 4 评论 -
信息学奥赛一本通 1380:分糖果(candy)
把出队的小朋友u的所有有关系的未收到糖的小朋友v收到糖的时间为u收到糖的时间加1。求从小朋友C出发的单源最短路径,顶点A到顶点B的路径即为将糖果从A传到B的时间。这样就可以得到每个小朋友接收到糖果的时间,加上m后即为每个小朋友吃完糖果的时间。假设一位小朋友A接收糖果的时刻是t,那么与该小朋友有关系的小朋友接收到糖果的时刻是t+1。由于每个小朋友吃糖的时间都是m,因而该小朋友A把糖吃完的时刻是t+m。每个小朋友是一个顶点,朋友间的关系是边,糖果从每个人传到另一个人都是1秒钟的时间,因而该图是无向无权图。原创 2023-02-10 02:07:05 · 2412 阅读 · 0 评论 -
信息学奥赛一本通 1379:热浪(heatwv) | 洛谷 P1339 [USACO09OCT]Heat Wave G
城镇为顶点,道路为边,道路的通过费用为边的权值。道路是双向的,所以是无向图。该问题求从起始城镇到终点城镇的最小费用,实际就是求从起始顶点到终点顶点的最短路径的权值。该题中城镇数(顶点数)最大为2500,可以使用Dijkstra算法,Dijkstra算法堆优化,及SPFA算法。原创 2023-02-07 23:36:57 · 1189 阅读 · 0 评论 -
信息学奥赛一本通 1389:亲戚
如果两人是亲戚,那么调用merge函数让两人所在的集合合并,同时更新集合中的元素数量(如果合并i,j所在集合时,j所在树作为i所在树根结点的子树,那么以i为根结点的集合的元素数量。并查集中,每个集合由一个树来表示,树的根结点代表一个集合。【注意】由于输入输出数据量很大,需要解除输入同步,换行用’\n’,或都使用scanf/printf。找到a所在集合的根结点,而后输出该集合的元素数量,也就是该家族的人数。表示以i为根结点的集合的元素数量,也就是这个家族的人数。要增加以j为根结点的集合的元素数量。原创 2023-02-06 19:30:43 · 887 阅读 · 0 评论 -
信息学奥赛一本通 1346:【例4-7】亲戚(relation)
并查集中,每个集合由一个树来表示,树的根结点代表一个集合。find函数可以返回一个结点所在集合的根结点。【注意】由于输入输出数据量很大,需要解除输入同步,换行用’\n’,或都使用scanf/printf。每组互相是亲戚的人构成一个集合,如果两人是亲戚,那么调用merge函数让两人所在的集合合并,。对于多组询问,判断两人是否在一个集合中,即为判断两人所在集合的根结点是否相同。原创 2023-02-06 00:08:17 · 1277 阅读 · 0 评论 -
信息学奥赛一本通 1377:最优乘车(travel) | 洛谷 P5767 [NOI1997] 最优乘车
该问题中的“最短路径”指的是有向无权图中的最短路径,即两点之间路径上边的条数。以巴士站为顶点,如果两顶点之间有边,说明两巴士站之间有直达的巴士线路。对于无权图,可以将该图每条边的权值都视为1,而后就可以使用Floyd,Dijkstra,SPFA等方法求解。【注意】由于每行末尾可能是"\r\n",因此在输入第一行m与n后,需要去掉本行的换行符时,不能只写一句。),因为当结尾是"\r\n"时,只会读入"\r",还留下了"\n"。注意:每行末尾的换行符可能是"\r\n"或"\n"。原创 2023-02-01 19:45:12 · 2454 阅读 · 0 评论 -
信息学奥赛一本通 1376:信使(msner)
记第一个哨所为顶点s,信息从第一个哨所传递到表示为顶点x的某哨所可能有多条路径,每条传送路径有一个花费的时间,自然要选择花费时间最少的传送方案,也就是图中从顶点s到顶点x的最短路径。要想完成整个送信过程,就要让所有其他哨所都接收到第一个哨所传出的信,完成整个送信过程的时间就是最晚收到信的哨所的收信时间,也就是顶点s到其它所有顶点的最短路径中路径长度最大值。每个哨所是一个顶点,哨所与哨所之间的通信线路为边,两哨所间通讯花费的时间为边的权值。从哨所s到哨所x的送信时间就是顶点s到顶点x的最短路径的长度。原创 2023-02-01 01:10:29 · 2226 阅读 · 0 评论 -
信息学奥赛一本通 1391:局域网(net)
因此该题需要求原图的最小生成树,求出最小生成树的边权值加和,用原图所有边的权值加和减去最小生成树的边权值加和,即为去掉的边权值加和的最大值。要使n个顶点的图中任意两顶点之间都有路径,而且没有回路,那么就需要不断去掉边,剩下的图是原图的生成树。要使得去掉边的权值加和最大,那么就是要求剩下的生成树的所有边的权值加和最小。一个局域网中任何两台电脑都可以连通,也就是说图中任意两顶点之间都有路径。每台电脑是一个顶点,两台电脑间的网线是边。记图中顶点数为V,边数为E。就是两个顶点之间边的权值。原创 2023-01-30 01:06:05 · 1475 阅读 · 0 评论 -
信息学奥赛一本通 1349:【例4-10】最优布线问题 | 1350:【例4-11】最短网络(agrinet)
该题输入的是邻接矩阵,因此使用邻接矩阵解决该问题。当然也可以保存为邻接表。最小生成树模板题,求最小生成树所有边权加和。记图中顶点数为V,边数为E。原创 2023-01-30 00:39:46 · 1290 阅读 · 0 评论 -
信息学奥赛一本通 1348:【例4-9】城市公交网建设问题
每次在未选择的顶点中选择到已选择顶点边权值最小的顶点,将其加入最小生成树中。设选择的新顶点为u,这个新的顶点u与最小生成树中已选择的顶点。Kruskal算法是加边法,把获得最小生成树过程中选择的边都加入到一个容器(set或vector)中进行排序,按规则输出该容器中的所有边即可。该题难点是要保存最小生成树的所有边,对于不同的求最小生成树的算法,有不同的方法来完成。多条边之间,第一个顶点小的排在前面。输出时要求对于每条边,小的顶点写在前,大的顶点写在后。可以理解为:u顶点是从最小生成树中的哪个顶点连出来的。原创 2023-01-24 01:27:08 · 3072 阅读 · 0 评论 -
信息学奥赛一本通 1415:【17NOIP普及组】图书管理员 | 洛谷 P3955 [NOIP2017 普及组] 图书管理员
可以先对book数组进行升序排序,而后对于每个读者,在book数组中二分查找满足图书编码末len位与读者需求码code相同的第一个图书编码。这就要求图书编码关于末len位有序(如果末len位相同,那么图书编码小的排在前)。可以先对book数组进行升序排序,而后对于每个读者,在book数组中顺序查找满足图书编码末len位与读者需求码code相同的第一个图书编码,该编码就是满足条件的图书编码中的最小值。对于每个读者,需求码长度为len,需求码为code,图书编码存入book数组。题目要求图书编码不超过。原创 2023-01-20 17:58:02 · 2160 阅读 · 0 评论 -
信息学奥赛一本通 1373:鱼塘钓鱼(fishing)
集合:钓鱼方案限制:最远走到第几个鱼塘,经过总时间属性:钓鱼数量条件:最大统计量:钓鱼数量状态定义dp[i][j]:最远走到第i鱼塘,消耗时间j,可以钓到鱼的最大数量。初始状态dp[0][j]=0:在前0个鱼塘中钓鱼,消耗时间j,可以钓到鱼的最大数量为0。原创 2023-01-05 02:57:13 · 2464 阅读 · 1 评论 -
信息学奥赛一本通 1916:【01NOIP普及组】求先序排列 | 洛谷 P1030 [NOIP2001 普及组] 求先序排列
已知中序、后序遍历序列,构建二叉树,而后对该二叉树做先序遍历,得到先序遍历序列。思路与写法1相同,不同点在于如果使用string类,需要使用string类对象的。成员函数来取子串,我们需要分别计算出左右子树中序(后序)遍历序列子串的长度。设全局的字符数组:s_m表示中序遍历字符串,s_p表示后序遍历字符串。为后序遍历序列构建二叉树,返回二叉树根结点的地址。原创 2023-01-03 18:51:23 · 981 阅读 · 0 评论 -
信息学奥赛一本通 1372:小明的账单
数据在multiset中是有序的,默认按升序排序,multiset中第一个元素是最小值,最后一个元素是最大值。大顶堆中账单面额更大的更优先,小顶堆中账单面额更小的更优先。输入n,循环n次,把每天的账单数值加入到multiset中,每天选出multiset中的最大值和最小值,输出并删掉这两个值。输入数据,对于输入的每个账单,生成一个账单对象,给每个账单都分配唯一的编号,并把每个账单分别加入大顶堆和小顶堆。【注意】输出数据量较大,可以使用scanf/printf,或解除io同步,io解绑,使用’\n’。原创 2022-12-31 02:02:54 · 2204 阅读 · 0 评论 -
信息学奥赛一本通 1371:看病
输入数据,遇到push时,生成一个患者,加入优先队列。遇到pop时,取优先队列的队头(堆顶),而后出队(删除堆顶)。如果优先队列为空,输出none。设优先队列(堆),里面保存Person类型的对象,优先级定义为:病情优先级高的人更优先。,因此要用scanf/printf来做输入输出,或解除IO同步,IO解绑。设结构体类型Person表示一个患者,包含属性:名字,病情优先级。,如果使用优先队列(堆),那么添加、删除的复杂度都是。【注意】该题输出数据量达到。添加和删除的患者数量达到。规模,或输出数据量达到。原创 2022-12-30 01:49:16 · 2212 阅读 · 0 评论 -
信息学奥赛一本通 1370:最小函数值 | 洛谷 P2085 最小函数值
我们可以先把所有函数x=1时的值加入到一个集合中,取出其中的最小值,然后让生成该值函数的自变量加1,把求出函数值放到这个集合中。循环m次,每次循环取堆顶,获得各Func类对象中的最小函数值,输出该值。而后删除堆顶,让该Func类对象离开堆,接着让该对象的x加1,再把这个新的对象插入堆。设堆pq,堆中保存的是Func类对象,堆中的优先级定义为:Func类对象的函数值越小,优先级越高。因此,可知二次函数的二次项系数a,一次项系数b,常数项c都是正整数。对于该函数来说,x=1时函数值最小,x=2时函数值第二小。原创 2022-12-20 23:44:34 · 1173 阅读 · 0 评论 -
信息学奥赛一本通 1351:【例4-12】家谱树 | 洛谷 B3644 【模板】拓扑排序 / 家谱树
如果这样建图:每个人是一个顶点。如果a是b的父辈,那么有一条从a到b的有向边。根据拓扑排序的定义:如果从a到b有一条路径,那么b在拓扑排序中在a的后面。那么这个图的拓扑排序可以满足题目对所求的序列的要求。要求序列中“每个人的后辈都比那个人后列出”。因此这是个拓扑排序模板题,建图,求拓扑排序。原创 2022-12-14 22:17:45 · 1704 阅读 · 0 评论 -
信息学奥赛一本通 1369:合并果子(fruit) | 1836:【04NOIP提高组】合并果子 | 洛谷 P1090 [NOIP2004 提高组] 合并果子
复杂度内取到所有果堆中数量最小的一堆,也就是取当前多个数字中的最小值,需要用到堆(heap)这一数据结构,C++ STL中提供了以堆为原理的优先队列(priority_queue),可以使用该容器求数字中的最小值。将优先队列设为小顶堆,将n个数字加入到优先队列之中,每次出队两个数字,出队的两个数字就是最小的两个数字,将这两个数字加和,即为合并两堆果子。如果a, b两堆合为一堆,则可以画一个根结点g表示a,b合并后的果堆,这个结点的左孩子是a,右孩子是b。下图中,冒号后面的数字表示果子数量。原创 2022-12-12 03:12:44 · 2398 阅读 · 0 评论 -
信息学奥赛一本通 1367:查找二叉树(tree_a)
中序遍历的同时做计数,判断当前遍历到的结点的值是不是x,如果是,则记录当前的计数。默认各结点的值不同,则不会再次遍历到值为x的结点。可以默认各结点的值是不同的。原创 2022-11-10 22:41:45 · 1508 阅读 · 0 评论 -
信息学奥赛一本通 1366:二叉树输出(btout)
该题意为:为每个结点都设一个长度:叶结点的长度为1,一个非叶结点的长度等于它的左右子树的长度之和。接着按照先序遍历的顺序,每行输出一个结点的值,这个结点的长度是几,这一行就输出几个字符。用preOrder函数递归输出每个结点,每个结点输出的次数是其长度。在结点中设成员变量length,表示这个结点的长度。用calcLen函数递归求出每个结点的长度。原创 2022-11-08 00:00:41 · 1313 阅读 · 0 评论 -
信息学奥赛一本通 2082:【21NOIP提高组】报数 | 洛谷 P7960 [NOIP2021] 报数
类比判断多次询问的数字是不是质数的问题,可以通过筛法求质数表,而后询问的方法来减少复杂度。简单说成:判断某数字的因数中是否包含7。否则,要输出x的下一个因数包含7的数字。表示数字i的下一个因数不包含7的数字。次的询问,如果预先确定了每个可能的数字的的因数中是否包含7,那么每次询问的复杂度为。根据新的规则,任何一个十进制中某一位含有7的数字的倍数都不能报出来。是一个因数不包含7的数字,它的下一个因数不包含7的数字是。在生成该数组后,x的下一个因数不包含7的数字就是。对于输入的x,如果x的因数包含7,即。原创 2022-11-04 17:06:55 · 1092 阅读 · 0 评论 -
信息学奥赛一本通 1368:对称二叉树(tree_c)
注意在遍历顺序存储结构的树的时候,临时求出的下标可能会很大(因为每次都会乘以2),所以数组尽量开得大一些(比如最后一个结点的地址是1000,那么要把数组长度开成2000多),也可以先记录整个顺序存储结构tree数组中最后一个元素的下标tn,如果访问到的下标超过tn,那么这次访问无意义,直接返回。如果使用非递归的方法做遍历,就可以使用函数的返回值来表示该树是否对称,效率更高。遍历整棵树(使用哪种遍历方法都可以),看每个结点的左右孩子,如果左右孩子中有1个是空结点而另一个不是,那么整棵树就不是对称的。原创 2022-11-03 22:56:32 · 1191 阅读 · 1 评论