登录社区云,与社区用户共同成长
邀请您加入社区
问题描述一年一度的"跳石头"比赛又要开始了!这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石。组委会已经选择好了两块岩石作为比赛起点和终点。在起点和终点之间,有 NN 块岩石(不含起点和终点的岩石)。在比赛过程中,选手们将从起点出发,每一步跳向相邻的岩石,直至到达终点。为了提高比赛难度,组委会计划移走一些岩石,使得选手们在比赛过程中的最短跳跃距离尽可能长。由于预算限制,组委会至多从起点
第一行是一个整数 n,接下来 n 行每行是 2 个整数 ai,bi (ai<bi),表示比赛开始、结束的时间。由于 yyy 是蒟蒻,如果要参加一个比赛必须善始善终,而且不能同时参加 2 个及以上的比赛。现在各大 oj 上有 n 个比赛,每个比赛的开始、结束的时间点是知道的。yyy 认为,参加越多的比赛,noip 就能考的越好(假的)。所以,他想知道他最多能参加几个比赛。一个整数最多参加的比
小凯的疑惑题目描述小凯手中有两种面值的金币,两种面值均为正整数且彼此互素。每种金币小凯都有无数个。在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的。现在小凯想知道在无法准确支付的物品中,最贵的价值是多少金币?注意:输入数据保证存在小凯无法准确支付的商品。输入描述输入数据仅一行,包含两个正整数 aa 和 bb,它们之间用一个空格隔开,表示小凯手中金币的面值。其中,1≤a,b≤1091≤
现在已知 n 个苹果到达地上的高度 xi,椅子的高度 a,陶陶手伸直的最大长度 b,陶陶所剩的力气 s,陶陶摘一个苹果需要的力气 yi,求陶陶最多能摘到多少个苹果。陶陶又跑去摘苹果,这次他有一个 a 公分的椅子。对于 100% 的数据,n≤5000, a≤50, b≤200, s≤1000, xi≤280, yi≤100。第 3 行~第 3+n−1 行:每行两个数 苹果高度 xi,摘这个
P1308 [NOIP 2011 普及组] 统计单词数。
【代码】题海拾贝:P1091 [NOIP 2004 提高组] 合唱队形。
【代码】P1094 [NOIP 2007 普及组] 纪念品分组。
龙虎斗题目描述轩轩和凯凯正在玩一款叫《龙虎斗》的游戏,游戏的棋盘是一条线段,线段上有 nn 个兵营(自左至右编号 1 ~ nn),相邻编号的兵营之间相隔 1 厘米,即棋盘为长度为 nn − 1 厘米的线段。ii 号兵营里有 cici 位工兵。下图为 nn = 6 的输入描述轩轩在左侧,代表"龙";凯凯在右侧,代表"虎"。 他们以 mm 号兵营作为分界,靠左的工兵属于龙势力,靠右的工兵属于虎势力
有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家)。不同的国家可能有相同的文化。不同文化的国家对其他文化的看法不同,有些文化会排斥外来文化(即如果他学习了某种文化,则他不能到达排斥这种文化的其他国家)。现给定各个国家间的地理关系,各个国家的文化,每种文化对其他文化的看法,以及这位使者游历的起点和终
为使得参加晚会的同学所获得 的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品, 并且每组纪念品的价格之和不能超过一个给定的整数。为了保证在尽量短的时间内发完所有纪念品,乐乐希望分组的数目最少。你的任务是写一个程序,找出所有分组方案中分组数最少的一种,输出最少的分组数目。100% 的数据满足:1≤n≤3×104,80≤w≤200,5≤Pi≤w。第一行包括一个整
其实,分块是一种思想,而不是一种数据结构。从 NOIP 到 NOI 到 IOI,各种难度的分块思想都有出现。分块的基本思想是,通过对原数据的适当划分,并在划分后的每一个块上预处理部分信息,从而较一般的暴力算法取得更优的时间复杂度。分块的时间复杂度主要取决于分块的块长,一般可以通过均值不等式求出某个问题下的最优块长,以及相应的时间复杂度。分块是一种很灵活的思想,相较于树状数组和线段树,分块的优点是通
剩下的很显然,计算同一个矩形中两点间的“高速公路”的边权并记录,计算不同矩形的两点间的“航线”的边权并记录,跑 floyd 即可,最后枚举起点与终点的状态。但是由于题目只给出了矩形的三个顶点的坐标,第四个顶点应该自己计算。声明:为了提高代码可读性,此代码采用了 AI 重构。个点,考虑用邻接表、floyd 算法解决此题。一种很显然的做法,注意到数据规模。种不同的状态(矩形的四个顶点)。考虑拆点,拆点
文章摘要:本文主要介绍了栈和队列的基本概念及其操作。栈是一种遵循“先进后出”原则的数据结构,操作包括入栈、出栈、显示栈顶元素等。通过示例展示了栈的操作过程,并提出了相关问题。队列则是一种“先进先出”的数据结构,操作包括入队、出队、获取队首元素等。文章通过多个编程题目进一步讲解了队列的实现和应用,如模拟舞会配对、破解密码等。最后,文章列出了课后作业题目,供读者进一步练习和巩固所学知识。
现在有 n 堆果子,每堆果子的重量为 ai,你要进行 n−1 次合并。每次合并会把两堆果子合并成一堆果子,合并需要花费的体力为这两堆果子的重量之和,合并后果子的重量也为这两堆果子的重量之和。现在让你求出 n−1 次合并花费的最小总体力。
第四章:递归算法
根据经过顺序,在格子中依次填入 1, 2, 3, ... , n ,便构成了一个螺旋矩阵。对于 100%的数据,1≤n≤30,000,1≤i≤n,1≤j≤n。输入共一行,包含三个整数n,i,j,每两个整数之间用一个空格隔开,分别表示矩阵大小、待求的数所在的行号和列号。现给出矩阵大小 n 以及 i 和 j,请你求出该矩阵中第 i 行第 j 列的数是多少。输出共一行,包含一个整数,表示相应矩阵中第 i
表示阶乘,定义为 n!用高精度计算出 S=1!对于 100% 的数据,1≤n≤50。一个正整数 S,表示计算结果。
大家应该知道,约数是成对出现的(平方数除外),也就是说,一个数的第一小约数乘第一大约数相乘等于这个数,第二小约数乘第二大约数相乘也依然等于这个数!因此,只要找出n的最小约数(1除外),再用n除以这个数,就能得到结果了!已知正整数 n 是两个不同的质数的乘积,试求出两者中较大的那个质数。这题真的不难,只不过数据点有点坑,因此要多多留意(小心!有人说,其实没必要枚举到2,枚举到n的平方根就行了。输出一
苹果成熟的时候,陶陶就会跑去摘苹果。陶陶有个30厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试。现在已知10个苹果到地面的高度,以及陶陶把手伸直的时候能够达到的最大高度,请帮陶陶算一下她能够摘到的苹果的数目。第一行包含10个100到200之间(包括100和200)的整数(以厘米为单位)分别表示10个苹果到地面的高度,两个相邻的整数之间用一个空格隔开。第二行只包括一个100到12
经过 11 年的韬光养晦,某国研发出了一种新的导弹拦截系统,凡是与它的距离不超过其工作半径的导弹都能够被它成功拦截。当工作半径为 0 时,则能够拦截与它位置恰好相同的导弹。但该导弹拦截系统也存在这样的缺陷:每套系统每天只能设定一次工作半径。而当天的使用代价,就是所有系统工作半径的平方和。某天,雷达捕捉到敌国的导弹来袭。由于该系统尚处于试验阶段,所以只有两套系统投入工作。如果现在的要求是拦截所有的导
首先给出生成子图的定义(From OI Wiki):嗯……有点抽象,不妨简化一下:有一个图\(G\),如果删去\(G\)中的若干条边与若干个点得到一个图\(G'\),且图\(G'\)还保证连通,则称\(G'\)为\(G\)的生成子图。那么显然,如果\(G'\)是一棵树,那么\(G'\)称为\(G\)的生成树。显然,生成树不一定唯一。那么,最小生成树的“最小”决定于你要求什么,是点权或是边权?由你自
算法分类:高精度计算运算。
无论哪一种选择,当前数都会是某个导弹拦截系统的最后一个数,要使导弹拦截系统的数量尽可能的小,贪心地想,在选择之后,要让除当前数所在导弹导弹拦截系统外的所有系统的最后一个数尽可能的大,也就是要找到大于等于当前数的最小导弹系统结尾数,把当前数接在这个导弹系统的后面,这样在后面的选择中这些系统才能容纳的导弹高度更高,才能让导弹拦截系统的数量尽可能的小。选择一:重新开一个导弹拦截系统,要在g[]数组后面加
树状数组是一种高效的数据结构,用于维护序列的区间和,支持单点修改和区间查询操作,时间复杂度均为$O(\log n)$。其核心思想是通过lowbit函数确定每个节点的管辖范围,并通过递推关系快速更新和查询。在实现中,update函数用于单点修改,通过逐级更新父节点来维护区间和;sum函数用于查询前$i$项的和,通过逐级累加子节点的值得到结果。区间查询则通过两次sum调用相减实现。树状数组适用于需要频
题目P1983 [NOIP2013 普及组] 车站分级要求根据火车停靠站点的信息,确定火车站的最小级别划分。每个火车站的级别由其停靠的火车决定,未停靠的火车站级别必须低于停靠的火车站。通过拓扑排序,可以有效地解决这个问题。首先,标记每趟火车停靠的站点,然后建立未停靠站点指向停靠站点的有向边,避免重边。初始化每个站点的级别为1,通过拓扑排序更新每个站点的级别,最终输出最高级别。该方法确保了级别划分的
/找右子树的根 k+1->结尾都是中序遍历的右子树 后序遍历的从k->结尾-1。//找左子树的根 0->k-1是中序遍历的左子树 k是中序遍历的根节点。(约定树结点用不同的大写字母表示,且二叉树的节点个数 ≤8)。//最后一个字符就是根节点 也就先序遍历的第一个节点。共两行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。
这段Java代码的主要功能是计算在给定范围[x, y]内,满足特定条件的整数对(i, j)的数量。具体来说,对于每个整数i,计算j = x * y / i,然后检查i和j的最大公约数(gcd)是否等于x,以及它们的最小公倍数(lcm)是否等于y。如果满足这两个条件,则计数器ans加1。代码中使用了递归方法计算gcd,并通过gcd计算lcm。最终,程序输出满足条件的整数对的数量。
若上一个保留的石头和终点之间的距离也小于num,说明最后一段距离不够,我们需要从当前保留的最后一个石头开始移除至少一个前面保留过的石头才能保证最短距离大于等于num。由于本题出现了最大最短跳跃距离这个最大最小值的关键词,我们考虑对答案区间(跳跃距离)使用二分查找。当上一个保留的石头与后面遍历到的石头之间的距离小于num的时候,我们可以将当前遍历到的石头移除。跳跃距离越大,移动次数越多,所以跳跃距离
但这个魔法不能连续使用, 而且这个魔法的持续时间很短,也就是说,如果你使用了这个魔法,走到了这个暂时有颜色的格子上,你就不能继续使用魔法;只有当你离开这个位置,走到一个本来就有颜色的格子上的时候,你才能继续使用这个魔法,而当你离开了这个位置(施展魔法使得变为有颜色的格子)时,这个格子恢复为无色。任何一个时刻,你所站在的位置必须是有颜色的(不能是无色的), 你只能向上、下、左、右四个方向前进。= g
但是明显不是最优的,用脑子想了一下,发现 dp[2][j](j>6)=20,这个 20 怎么来的呢,当然是从前一个状态来的(注意这里就可以分为两种情况了):一种是选择第二个物品放入,另一种还是选择前面的物品;接着 i=2 放两个物品,求的就是 dp[2][j] 了,当 j<5 的时候,是不是同样的 dp[2][j](j<5) 等于0;到这里就可以了,依次类推,动态转移方程为:dp[i][j]=ma
本题为树状数组模板题,要求维护区间和,进行单点修改和区间查询。通过树状数组的基本操作,如update和sum,能够高效地完成这些任务。代码中首先初始化树状数组,然后根据输入的操作类型,执行相应的修改或查询操作。具体实现包括对数组元素的单点更新和区间求和的查询。通过这种方式,可以快速处理动态数组的修改和查询需求。
在说线性dp之前,我们先来聊一聊动态规划是啥?背包问题是线性DP的一个拓展,它的模型一般为:有一个体积为V的背包,有n种物品,每种物品的数量有限或者无限,每个物体有它的属性(体积、质量等),问在不超过背包体积的情况下如何选择物品才能让物品的属性之和最大。首先,很容易想到贪心是错误的,无论是从大到小贪,还是从小到大贪心的往背包里放物品,都可以找到反例。那么我们在这个地方就要考虑动态规划了背包问题是线
本文介绍了洛谷 P1955 [NOI2015] 程序自动分析的解题思路与代码实现。题目要求处理多组数据,每组数据包含多个变量的相等或不等约束条件。解题核心是使用并查集来表示变量集合,并通过离散化处理变量编号以应对大范围编号问题。具体步骤包括:首先对变量的相等约束进行并查集合并操作,然后检查所有不等约束是否与并查集状态冲突。如果所有约束条件都能被满足,则输出"YES",否则输出&
在每一组中挑一个物品例题:分组背包P1757 通天之分组背包 - 洛谷01背包,完全背包,多重背包,分组背包结合在一起的背包问题例题:樱花P1833 樱花 - 洛谷限制条件增多的背包问题,必须要空间优化。例题:L 国的战斗之间谍P1910 L 国的战斗之间谍 - 洛谷。
/遍历当前字符串的长度找到子串a[i]next.replace(j,a[i].size(),b[i]);if(str == a[i]) { // 如果字串和变换的串相同就可以做变换操作。规则的含义为:在 A 中的子串 A1 可以变换为 B1,A2 可以变换为 B2⋯。若在 10 步(包含 10 步)以内能将 A 变换为 B,则输出最少的变换步数;共进行了 3 次变换,使得 A 变换为 B。
【代码】前缀和与差分刷题。
请你求出,一共有多少个合法的数列。两个合法数列 a,b 不同当且仅当两数列长度不同或存在一个正整数 i≤∣a∣,使得 ai=bi。本题数据来源是 NOIP 2001 普及组第一题,但是原题的题面描述和数据不符,故对题面进行了修改,使之符合数据。我们要求找出具有下列性质数的个数(包含输入的正整数 n)。对于全部的测试点,保证 1≤n≤103。输出一行一个整数,表示合法的数列个数。对本题情况的反
i=fa[p)col[i]=1),求d2时,正常边权为1,如果col[u]==col[v]==1,则u-v边为重合边,在d2中边权为0,其实这些边在d1z中应该也算成0,但是在求d1时,视为1,所以还要再减去一遍,则把这些边的权值设为-1,求出d2,路径长度为2 *(n-1)-d1+1-d2+1。1.(K=1)加一条:连接直径(最长路径),直径和新边构成环,节省的长度就是直径d1(直径上走了一遍)
NOIP2016 提高组 D2T1。
设p位置的喷头半径为r,圆心为P半径为r的圆与草坪上边界线段相交于点A和点C。该题问最少使用多少喷头可以覆盖草坪,即询问在给定多个区间中最少选择多少区间可以覆盖给定的线段。每个喷头覆盖的区域是一个圆形,草坪上被一个喷头覆盖的有效区域是一个矩形,该矩形的左端点坐标到右端点坐标形成一个线段。的左端点,第0位置就不会被任何区间包含,这就不是一组解了。这一次选择的,也就是唯一包含第0位置的区间,记该区间为
模拟,顾名思义,就是题目中给出一个流程,然后你写出一份代码进行模拟,实现这个流程。它一般是比赛中的签到送分题,但是模拟一定要注意细节,千万要读懂题目中的意思!模拟通常需要一定的代码能力,它码量大,操作多且思路繁琐,需要多多练习。(因为循环清空不彻底,考场代码挂了30分.......)、模拟算法是一个非常经典的算法,是所有人学习的第一个算法。再枚举每一次出拳两人的胜负结果,统计得分,得出答案。十分小
当地窖及其连接的数据给出之后,某人可以从任一处开始挖地雷,然后可以沿着指出的连接往下挖(仅能选择一条路径),当无连接时挖地雷工作结束。第 3 行有 n−1 个数(0 或 1),表示第一个地窖至第 2 个、第 3 个 …如第 3 行为 11000⋯0,则表示第 1 个地窖至第 2 个地窖有路径,至第 3 个地窖有路径,至第 4 个地窖、第 5 个 …第 n+1 行有 1 个数,表示第 n−1 个地窖
大致思路:考虑数组a[n],在读入n个数字后先遍历得到n个数字中最小的数a[min],那便是[1,n]的次数,加到累加器count里,将每个数都减去a[min]得到新数组,再把旧数组分割为两个新数组(不包括a[min])重复上述操作知道该数组里的元素都变为0。春春每天可以选择一段连续区间 [L,R] ,填充这段区间中的每块区域,让其下陷深度减少 1。一种可行的最佳方案是,依次选择: [1,6]、[
某次科研调查时得到了 n 个自然数,每个数均不超过 1.5×109。已知不相同的数不超过 104 个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。会自动按照键(即自然数)从小到大的顺序排序,我们只需遍历输入的自然数,统计每个数出现的次数,最后按顺序输出结果即可。共 m 行(m 为 n 个自然数中不相同数的个数),按照自然数从小到大的顺序输出。每行输出 2 个整数,
在搜索的过程中,如果搜索树中有很多重复的结点,此时可以通过⼀个 "备忘录",记录第⼀次搜索到的结果。当下⼀次搜索到这个结点时,直接在 "备忘录" ⾥⾯找结果。其中,搜索树中的。在⽤记忆化搜索解决斐波那契问题时,如果关注 "备忘录" 的填写过程,会发现它是从左往右依次填写 的。当 位置前⾯的格⼦填写完毕之后,就可以根据格⼦⾥⾯的值计算出 位置的值。动态规划(Dynamic Programming,简
阶段:前i个元素决策:是否将第i加入子段策略:子段划分的方案策略集合:前i个元素的所有子段划分方案。条件:费用最大统计量:费用状态定义dpidp_idpi:前i个元素的所有子段划分方案中,费用最大的方案的费用。初始状态dp00dp_0=0dp00。
的过程中遇到负数,那么加上这条边就会使答案不是最大的,也就意味着算上有环的边的答案不可能是最大的,除非只能跟原来的环有公共边。没错,通过以上的推论,我们会惊奇的发现,有了这个环,会让我们在巡逻的过程中只走过一次这些边 (这些边指环上的边)。,相当于要用不是环上的边抵消环上的边。根据我们的前置知识,dfs 的做法遇到负边权就会 GG,所以这里我们用 dp 的做法,前面因为要求路径,所以用 dfs 的
对于kruskal的讲解
初看题,可能想到用BFS遍历图,然后将每次取完钱之后的结果累计,遇到酒吧就更新答案值。但是,本题为直接使用BFS必然会导致死循环,而标记每个走过的节点,又不能维护后来的值优于先来的值的情况。于是,需要先对强联通分量并入一个集合中进行(即让多个可以相互到达的点看作一个整体),之后就可以开心的用BFS处理了。关于缩点处理,本文采用的是算法,即用两遍DFS预处理图:第一次 DFS,选取任意顶点作为起点,