
[刷题之旅]
记录我的刷题历程
cykap
这个作者很懒,什么都没留下…
展开
-
[刷题之旅no44]排序
一个数组a,大小n一个k保证k<=n且a[i]<=k;来一个时间复杂度为O(n)的排序算法思路:就是开一个大小为k的数组b初始化遍历数组a,记录相应大小值的出现次数遍历b,覆盖a结束void sort(int a[],int n,int k)//将a中元素递增排序{ // 请在这里补充代码,完成本关任务 /********** Begin *********/ int b[k+1]; for(int i=0;i<=k;i++)原创 2021-04-09 21:30:01 · 147 阅读 · 0 评论 -
[刷题之旅no41]利用栈和队列判断回文数
众所周知栈是后进先出队列为先进后出所以把字符串输入到队列和栈之中然后每次出队和出栈,如果相等,继续出队和出栈到len/2+1的时候,直接说明全对即可int isPalindrome(char *str)//判断字符串str是否回文,是则返回1,否则返回0{/**********begin**********/ TWSTACK stack; QUEUE queue; inistack(stack); iniQueue(queue); int i=0;原创 2021-04-09 20:08:51 · 369 阅读 · 0 评论 -
[刷题之旅no40]P3369 【模板】普通平衡树&&[数据结构no4]splay树
嗯。。。看到题目之后,我就觉得应该直接看题解了,别怪我,我连数据结构也没学呢题解也看不懂哦看到大佬的题解:我看到了:SplayTreapen…那就先学splay,再学treap吧!(但是我估计我学了splay之后就没心思学treap了),...原创 2021-04-05 13:57:31 · 158 阅读 · 0 评论 -
[刷题之旅no39]P1983 [NOIP2013 普及组] 车站分级
好的朋友们这道题,很简单求车站的分级一旦涉及到这种级别,优先级,你要干什么,就必须先干什么的这类话都可以通过建图,拓扑排序来找到答案!数据结构:1.链式前向星,一共可能有十万条边1.读取车站个数,一共有多少次车次2.循环m次,每次读取车次,读完车次前向星建边,记录每个点的入度,就是建边的时候++;3.遍历找到入读为0的点,全部入队,设置head,tail,tallast4.循环(队列不是空){判断是否时空队列看队首元素遍历所连点所连点入度减一如果入度为0那么直接入队(移动t原创 2021-04-04 19:26:45 · 240 阅读 · 0 评论 -
[刷题之旅no38]P1381 单词背诵
具体代码就不放出来了,毕竟是一个连数据结构课都还没学的大一萌新,只是在这里分享一下我的思路,一个初学者的小想法。步骤:1.读取n,循环读取字符串2.把每个读到的字符串用哈希求出一个具体的数值(具体怎么求之后说),并且按顺序存入到一个名字叫dictionary的数组之中。3.对dictionary排序(升降无所谓)4.读取m,循环读取字符串5.把每个读取到的字符串用哈希算出一个值6.在我们已经排好序的dictionary的数组里面找到他的下标(即编号)7.进行入队等一系列操作(之后再说,重点)原创 2021-04-04 13:56:34 · 219 阅读 · 0 评论 -
[刷题之旅no37]合并果子
给数组大小给数组元素每次找出两个数求和,把求和的元素放回数组里面,累计求和值直到数组里面只剩下一个值位置,求求和值的最小值看到这道题,看到贪心的标签,我假设用贪心算法可以解决只需要每次计算找出整个数组中的最小的两个元素就好了那么就要涉及到排序当然也可能涉及到维护。反正我只需要保证我每次都能取出当前队列中最小的那两个元素就行其它倒是不用操心现在只需要思考如何维护队列的大小就好了已知至多有1万个元素,那么我们这样做至少经过9999次运算这9999次运算对应着9999次维护我晕该如原创 2021-04-04 09:19:20 · 105 阅读 · 0 评论 -
[刷题之旅no36]P1309 [NOIP2011 普及组] 瑞士轮
暂时没什么好的思路,只能先试试看1.读取,读取对数,R轮数,Q最终名次2.循环2n次,读score3.循环2n次,读power4.根据score排序,将排序之后的编号存到rank数组中,rank可以直接和score合并成一个结构体4.比较函数直接进行好的思路:第一次先希尔排序因为每一次比赛都是两个人其中一个人加上一分,所以整个数组的整体顺序是没有发生太大变化的可以先用希尔吧2n拆分成两个数组进行排序,第一个数组就是13579第二个数组就是2468 10,然后用一次归并直接排先全都用希尔试原创 2021-04-03 21:25:57 · 287 阅读 · 0 评论 -
[刷题之旅no35]逆序对
1.归并排序思想。归并排序,就是把两个有序数对进行比较合并,变成一个有序数对如何得到两个有序数对呢?就是把两个有序数对分别再化成两个有序数对,然后再合并所以用到了递归的思想我们取其中一个状况来看,左边是从小到大的一个数列,右边是从小到大的一个数列,而当前数列中逆序对的个数如何来求呢?我们就要再归并过程中进行比较,如果左边一个元素大于右边一个元素,那么这个左边的元素的后面的所有元素就都大于右边这个元素如果左边这个元素不大于右边这个元素,那么左边这个元素也不会大于右边这个元素的所有元素,所以正常入队原创 2021-04-03 18:48:38 · 118 阅读 · 0 评论 -
[数据结构no3]树状数组
顾名思义:树状的数组,利用了巧妙地数学知识首先给定一个数组arr[i]然后根据这个数组可以构造出一个平衡了查询和修改操作的数组,树状数组树状数组大小和arr[i]长度相等设树状数组为c[i]那么他代表着从arr数组中从下标为i的元素开始往前数lowbit(i)个元素的和lowbit(i)是啥呢?数学方程为lowbit(x)=x&-x;怎么理解,就是把x转化为二进制数,从右开始一个一个数,数到第一个1出现为止,然后左边的都不要了留下的数就是10000…000。这就是lowbit(x原创 2021-04-03 15:21:28 · 117 阅读 · 0 评论 -
[刷题之旅no34]字符串哈希
哈希表需要解决的问题:1.确定函数2.确定冲突解决办法3.选择什么样的数据结构进行存储哈希表,开辟多大的空间解决问题:1.函数的确定:如何根据一个字符串来吧函数确定出来呢?字符串很长,每个字符都有确定的ascii码值,我需要做的就是确定一个计算公式,使得给一个字符串,我可以返回一个值直接使用长度来确定感觉就很好。这样最多1500的长度,也有利于我进行操作。故:H(x)=strlen(str)2.冲突解决办法:我认为可以直接使用链地址法则,确定一个结构体,内部由一个字符串和一个next原创 2021-04-03 11:15:27 · 110 阅读 · 0 评论 -
[刷题之旅no33]保龄球
题目解读1.数组大小2.数组元素3.查询次数4.查询大小输出:返回下标如果查不到,直接输出0思路:1.读取数组2.排序3.二分查找结束出现了一个问题,一个逻辑错误就是题目要求我寻找对应值在原数组中的下标。那么我就需要好好思考一下了。这样吧,那么改一下数组罢了改成二维数组,当数值排序的时候,相应原数组的下标也跟着交换即可其实再加入一个数组也可以,改动还可以更少,脑子瓦特了#include<stdio.h>int arr[100005][2]={0},n,q,原创 2021-04-02 21:45:38 · 139 阅读 · 0 评论 -
[刷题之旅no32]P1138 第k小整数
怎么解决这个问题呢。。第一思路:直接暴力求解,用希尔排序算法,然后遍历寻找最小整数即可。1.读取2.希尔排序结束看到有大佬用桶排序和什么主席树的,列入打卡学习目标,不过暂时不需要这道题就当复习一下昨天学习的希尔排序把!代码:#include<stdio.h>int num[10005]={0},n=0,k=0;void scan(){ scanf("%d %d",&n,&k); for(int i=1;i<=n;i++) { scanf("%原创 2021-04-02 21:20:19 · 280 阅读 · 0 评论 -
[刷题之旅no31]P1038 [NOIP2003 提高组] 神经网络
仔细一看,仔细一想,唔是bfs。1.数据结构:1.链式前向星2.line队列3.u数组记录结点阈值4.c数组记录结点兴奋程度5.out数组用于记录最终输出结果6.队列设置三个拨针,head,tail和lasttail(lasttail用于记录上一层级结点的最后一位的下标)7.isinline数组,判断当前元素是否入队8.flag判断到底能不能兴奋思路:1.读取点的数量和边的数量2.读取点,按顺序记录点的刺激点c和阈值u,更新c和u数组值,将刺激点c大于0的点入列,同时更新tail和原创 2021-04-02 20:22:21 · 309 阅读 · 1 评论 -
[刷题之旅no30]P3366 【模板】最小生成树prim和kruskal
经过题意我是这样理解的就是找到n-1条边,保证1.没有闭环2.长度求和最小3.如果无法生成这个树,那么输出orz需要解决的就是这三个问题最小生成树有两个算法:prim和kruskal算法我打算都练习一下,所以还是要先学算法kruskal算法实现1.edge结构体存图bigin,end,dis2.结构体排序3.让当前两个结点连通4.判断是否闭环5.如果闭环,取消联通,继续6.如果不闭环,总路径加和问题:1.如何表示结点连通情况2.如何快速判断是否闭环问题1不用考虑问题2原创 2021-04-01 21:23:07 · 133 阅读 · 0 评论 -
[刷题之旅no29]P3367 【模板】并查集
这道题开一个team数组,下标就是元素序号,值为元素所在集合再开一个teamlink数组,把在一个team中的元素连起来,结尾是0;如果要查询两个元素是否在同一个集合里面,只需要查看这两个是否在一个链表里面就可以了。每次来一个元素,就连到所在team的尾端即可如何判断尾端,就是team[i]=0;就是尾端判断两个元素是否相等,就是看他们两个尾端是否是同一个元素即可20分哈哈。其余全部TLE,让我看看标准答案到底是如何处理的优化在find函数递归+路径压缩也就是在find函数设置成为递归函原创 2021-04-01 16:11:06 · 93 阅读 · 0 评论 -
[刷题之旅no28]P2910 [USACO08OPEN]Clear And Present Danger S
1.给出结点数量,给出遍历结点数量2.给出遍历结点顺序3.给出结点之间的距离4.求解一个路径,保证路径上面有2给出的结点顺序OK现在我们来求解这个问题其实就是1.读取结点数量2.用一个数组储存遍历顺序3.用一个二维数组储存当前两个结点之间的顺序每个结点互相连通最多100个结点(有点友好啊)所以。我们只需要求解两点之间的最短路径即可。用什么方法呢?刚刚学了SPFA算法,感觉可以直接把这道题解决掉了。外层循环,遍历所有结点内层用我们的SPFA1.初始化headl,tail2.原创 2021-03-31 22:01:50 · 122 阅读 · 0 评论 -
[刷题之旅no27]P3371 【模板】单源最短路径(弱化版)
感觉这道题和上一道有点相似思路:数据结构:链式前向星1.读取数据。正常读取就可以了,把图构造出来2.从编号为c的点开始递归递归函数参数:node当前访问的点,从出发点到当前的点的距离dis直接标记当前结点如果dis>mindis[node]取消标记直接return,说明不是最优解其它情况,则访问和这个点相连的所有结点(访问过的结点就不要再访问了吧?)如果没有被标记,那么递归即可,dis+edge[i].dis;输出mindis[i] (i!=c);拿了40分三个TLE三原创 2021-03-31 20:48:38 · 104 阅读 · 0 评论 -
[刷题之旅no26]P3956 [NOIP2017 普及组] 棋盘
1.走棋盘同色直接走异色花一金无色可魔法魔法花两金不可连续魔要求最小金不同为负一思路:1.用深搜,设置参数,四个,坐标xy,是否可以使用魔法,当前金币数量根据当前位置判断可以走的方向,然后根据情况递归即可。问题:1.如何确定施加魔法的颜色2.如何执行施加魔法之后颜色消失这一步。3.如何防止重复绕圈,也就是如果我按照当前位置四个方向进行递归,肯定会出现重复路线解决问题:3.每次进入函数,将当前坐标相应位置标记为1.然后递归。当递归结束之后,把相应位置标记为0;return原创 2021-03-31 18:22:54 · 459 阅读 · 0 评论 -
[刷题之旅no25]P5318 【深基18.例3】查找文献
这么理解这道题:1.用合适的数据结构储存图2.分别用dfs和bfs对图进行遍历一共有10的五次方个结点,所以如果用二维数据储存路径显然不可行剩下的数据结构还有各种各样的表我需要什么呢?我需要给出一个结点,可以找到其能够直接到达的所有结点这样的话,链式前向星可以用来存图(好万能)存图过程中还需要判断结点大小进行插入。然后对当前结点进行遍历,深搜即可。由于论文不可以相互引用,所以所有结点都是单向的深搜:给一个结点,遍历和当前结点直接相连的所有结点,遍历一个,打印一个,递归一个广搜:给一个结原创 2021-03-30 22:10:50 · 232 阅读 · 0 评论 -
[刷题之旅no24]P1185 绘制二叉树
这道题更像一道数学题只要给出确定层数那么层与层之间的高度差可以被直接计算出来也就是每一层所在二维字符数组中的纵坐标可以被计算出来当二叉树确定之后,如果给定确定的第几层第几个结点,也可以把这个结点的坐标计算出来如果给定层级,也可以把这个层级的结点所影响到的范围也计算出来这样我们便可以根据给定的层级建造出相应的二叉树通过给定结点计算出节点位置和节点的影响范围然后把整个结点的影响范围删除,结点影响的整个范围不好计算,还是递归删除把递归参数需要点的坐标,如果是向下遍历,则需要见到什么删除什原创 2021-03-30 20:28:11 · 289 阅读 · 0 评论 -
[刷题之旅no23]P4913 【深基16.例3】二叉树深度
求解二叉树深度…这样太。。刚才我做的题中就有啊好吧,还是有点难度的,毕竟这道题的输入数据很。人性化。也就是说规则有点模糊?我们还是想办法确定一下数据结构好了。特殊点1.只要有儿子,必定有两个2.从左到右给儿子3.如果是0没儿子难点:确定合适数据结构储存输入数据用队列!因为他的子节点是按照顺序给的,从上到下,从左到右,所以先到先得,我们只需要使用一个队列,让非0结点入队即可。而且不断更新grade数组的值好的,当前80分,有一道题出错了,我需要猜想我的逻辑不全面的地方到底是怎样的原创 2021-03-29 20:43:25 · 190 阅读 · 0 评论 -
[刷题之旅no22]P1827 [USACO3.4]美国血统 American Heritage
其实这道题,就是给出树的中序遍历和前序遍历,让你写出他的后续遍历哈哈话说这道题跟之前的有点像啊。。思路就是递归别忘了左右边界的变化,上次你在这栽了坑递归函数,1.前序左端点找到根节点2.中序序列之中找到根节点,记录其坐标3.根据中序序列坐标和左右端点,计算左右子树长度,找到左坐标范围4.在前序序列中找到找到左右子树的坐标范围5.左子树递归,右子树递归6.打印根节点7.结束递归结束条件。左右端点相等,说明只剩一个点了好吧,看来又出现了我最害怕的逻辑出错了,这些下标算起来真是有点烦人原创 2021-03-29 19:47:11 · 154 阅读 · 0 评论 -
[刷题之旅no21]P3884 [JLOI2009]二叉树问题
题目输入:二叉树结点数量结点之间相邻情况需要求距离的两个结点编号输出:二叉树的深度,宽度和给定两个编号之间的距离问题所在:1.选定一个比较好的数据结构储存题目给定的数据2.利用这个数据结构把树的深度,宽度和给定两个结点之间的距离求出来。一、求树的深度:从根节点遍历整个树记录当前深度,时刻更新最大值即可二、求树的宽度:设置层级概念,也就是当前节点到根节点的路程长度+1;统计所有层级的节点数,取最大值即可。三、给定两个结点之间的距离:采用由下向上的方法例如给定两个节点a,b.那么原创 2021-03-29 18:49:53 · 150 阅读 · 0 评论 -
[刷题之旅no20]P1131 [ZJOI2007] 时态同步
这道题,理解一下每两个点之间的路径唯一,所以距离唯一给定一个特定的结点,现在求解:怎么样加路径长度,使得当前结点到其他结点的路径相等(要求求最小值)。。相当没有思路奥我现在的思路:相当空旷!1.用什么数据结构(或者说怎么构建这个树)如何建造这棵树呢?问题:题目给出的是两个结点,和链接两个结点之间的通路所以无法判断子父节点如何判断子父节点?激发点是1级结点和1级结点相连的是2级结点和2级结点相连的是3级结点和同一个结点相连的是同一级结点所以我就一遍遍遍历用一个三维数组记录题目数原创 2021-03-28 22:03:58 · 114 阅读 · 0 评论 -
[刷题之旅no19]P1087 [NOIP2004 普及组] FBI 树
思路,递归分治函数:参数就是结点在字符串上面的区间,L,R首先设置cnt0和cnt1=0;递归终止条件就是L==R此时判断是0还是1,打印B或者I//出错然后递归左子树,区间就是[L,R/2];递归右子树,区间就是[R/2+1,R];//出错然后看当前是F还是I,直接遍历即可for(int i=L;i<=R;i++){if(==1;if(==0if(cnt0*cnt1!=0printf}if(cnt0else if(cnt1return出现了一个错误,导致递原创 2021-03-28 11:51:44 · 255 阅读 · 0 评论 -
[刷题之旅no18]P1030 [NOIP2001 普及组] 求先序排列
就是:给出二叉树的中序和后序打印先序思路:递归分治,找到根节点之后把左右子树分开再递归设置函数参数为树分别在序列中的下标位置midL,midR,lterL,lterR,在中序中和在后续中终止条件:第一:没有位置,即空第二:长度唯一,直接打印求解子树在序列中的下标位置:第一直接拜访后序最后一个下标根节点的位置第二在中序中找到这个位置pRoot左子树在中序之中位置就是[midL,pRoot-1]左子树长度pRoot-midL;左子树在后序之中位置就是[lterL,lterL+pRo原创 2021-03-28 11:12:36 · 441 阅读 · 0 评论 -
[刷题之旅no17]kmp
具体kmp在我的[算法学习]之中,这里之讲解一些框架1.读取2.求解出nextval数组3.利用数组求解子串位置4.结束思路问题:next数组出现无限循环因为忘了初始化next[0]=-1;对于next数组初始化条件就是sp=-1,mp=0;而对于比较字符串的时候,需要sp=0.mp=0从0开始比较了,不是前后比较了初始条件:求next:next[0]=-1,sp=-1,mp=0;求出现位置:sp=0,mp=0;在这里插入代码片...原创 2021-03-28 10:30:59 · 83 阅读 · 0 评论 -
[刷题之旅no16]P3719 [AHOI2017初中组]rexp
简而言之,就是一个入栈计算可以先把连续的a转化为数字,然后进行计算即可1.空栈2.当前元素若是数字,直接入,但是需要判断当前栈顶是否ok若是左括号若是右括号开始出栈进行计算。栈顶元素大于0栈顶元素等于0栈顶元素等于-1说明当前计算完毕了。直接stack[top]=sum即可...原创 2021-03-27 16:02:10 · 370 阅读 · 1 评论 -
[刷题之旅no15]P1322 logo语言
读取:(scanf不读取空格,getchar()读取空格)先读一个字符若R那么直接跳过五个字符,直接读取数字,然后再跳过一个字符把R入字符栈,数字入数字栈然后再跳过一次(把左括号跳过去)若F或者B那么跳过一个字符,读取数字,二者入栈若‘]’,相当于出栈信号。此时一直出栈,直到遇到R为止数字和f一定要对应判断stack_c[top_c]若F,sum=sum+stack_n[top_n];top_c–,top_n–;若B,sum=sum-stack_n[top_n];top_c–,原创 2021-03-27 12:58:19 · 525 阅读 · 0 评论 -
[刷题之旅no14]P1553 数字反转(升级版)
说实话好像很简单的样子,因为我并不需要真正地把这个东西反转,只需要用一个字符串存储,然后倒着打印出来就好了。思路:1.scanf%s读取2.向后遍历,看下一位如果是’\0’说明是整数,此时记录当前下标flag=0&&并且是‘0’,不打印,如果不是‘0’,打印,flag=1即可。如果是’.’记录此时的位置把之前的反转打印出来然后继续遍历,找到’\0’,再把小数点之后,‘\0’之前的反转打印出来,特殊,如果全是0,那么就要把0也打印出来如果是’/’把之前的反转打印出来原创 2021-03-27 09:59:38 · 299 阅读 · 0 评论 -
[刷题之旅no13]P1042 [NOIP2003 普及组] 乒乓球
好的,这道题说实话有点简单?循环读取数值,利用int进行计数即可。每11次和21次进行一次输出就行。遇到的问题:由于他是换行输入的,所以不可以用%s直接读取,需要一个一个字符读取每11个数字需要输出一次的问题之所以没有每11个数字输出一次,就是因为scanf%c可以把换行符也读进去。所以应该设置判断将换行符剔除万万没想到全错了。。。我日,是我读错题了吗?如果一开始没比赛就遇到E的话,那么输出0:0,而且如果结尾没有盈余的话,也要输出0:0?真的自闭了,这都什么破题.是我语文有问题么/原创 2021-03-27 09:03:09 · 210 阅读 · 0 评论 -
[刷题之旅on12]P1886 滑动窗口 /【模板】单调队列
利用单调队列,解决求解滑动窗口最大值和最小值问题思路:数据结构:一个数组记录题目值一个二维队列,分别用来记录入队下标,对应元素左边下标,右边下标,方便双向出队更新队列头尾思路:1.读取长度,窗口长度2.读取数组元素3.for遍历数组,利用i记录处理元素个数若i<=k说明没入完若队列空元素入队(记录下标)更新head和tail,min和max队列不空当前元素和队首元素进行比较小于等于队首直接让当前元素下标入队让他右指向当前队首元素在队列中的位置让当前队首元素左指向这个元原创 2021-03-26 22:05:34 · 97 阅读 · 0 评论 -
[刷题之旅no5][NOIP2003 普及组] 栈
由于这是一个抽象的栈,所以实际上根本用不到栈来处理这个问题将这个问题抽象化:对于每个数字,只有push和pop两种操作而对于整个栈的输出,只需要2n次操作当栈不空且队列不空此时可以push和pop而当栈空时只可以pop而当push等于n时相当于把整个队列按照一定顺序push到栈里面去了,pop出来也不会改变顺序,我们此时结束所以可以定义一个stack函数有两个参数,一个push次数,一个pop次数当push=n说明结束push=pop说明栈空构造一个递归函数就行了可是这样出现了原创 2021-03-25 10:56:19 · 128 阅读 · 0 评论 -
[刷题之旅no11]P1162 填涂颜色
越容易用肉眼看出答案的题,用计算机越难实现。。。人眼是面观察,而计算机是点观察。一开始的思路就是:一但遇到了一个内部点,也就是从这个点开始,上下左右遍历,如果四个方向都可以遇到1,那么一定就是内部点。如果能遇到这样的点,那么直接进行递归涂色即可,非常简单。所以难点就在于:如何高效地找出一个符合条件的点呢?所以现在的思想:从上到下,从左到右遍历迷宫那么一定先遇到迷宫的左墙。若第一次遇到1,那么直接跳到下一行,当下一行再次遇到1的时候,开始对1后面的0进行判断,如果判断成功,那么直接停止遍历原创 2021-03-26 11:22:41 · 88 阅读 · 0 评论 -
[刷题之旅no10]UVA540 团体队列 Team Queue
好吧,算是一道难题吧。思路:1.读取队伍数,以次设置循环(如果队伍数等于0,直接终止循环)2.读取每个队伍的人数,将读取到的队员编号,记录到一个数组之中,数组下标就是队员编号,对应的值为队员所在队伍3.读取指令%s4.如果开头是e,说明是入队5.此时再读取入队人编号6.如果此时队列是空的head==0,把这个入队人入队,放到head的位置,然后tail+1;同时找到这个人对应的队伍,将head记录为此时队伍的队尾编号,让将r_tail=head。7.如果队列不是空的(如何判断队列不是空的呢?原创 2021-03-25 21:34:18 · 196 阅读 · 0 评论 -
[刷题之旅no9]P5788 【模板】单调栈
话说我奶牛排队那道题还卡着呢。只考单调栈确实简单了点奥数组从1开始找出每个元素右边第一个大于它的数的下标,如果没有那么输出0即可好简单。。。思路:遍历数组1.栈空入栈2.当前元素大于栈顶元素在栈顶元素的下标对应位置记录当前元素的下标出栈循环之后,别忘了将当前元素入栈啊!3.当前元素小于等于栈顶元素入栈注意,入栈的是下标,比较的时候将栈元素带入数组进行比较,不然没法确定下标。最终输出即可。#include<stdio.h>int stack[3000005]={原创 2021-03-25 19:15:24 · 198 阅读 · 0 评论 -
[刷题之旅no8]P1165 日志分析
仔细思考之后,由于每次查询操作都只需要最大值,那么只要保证每次出库,我依旧可以找到最大值即可。也就是说,设置一个二维数组,stack[i,0]代表当前入库的货物重量,stack[i,1]代表这个货物入库之前的货物重量最大值就好了啊!思路:读取操作数如果0读取重量比较当前货物重量和最大重量如果大于,记录入栈之前的最大重量,更新最大值,入栈如果小于等于,那么记录入栈前的最大重量,入栈如果1判断是否top=0等于0,空的,不操作,continue不是0,更新最大值,出栈如果2直接输出m原创 2021-03-25 18:59:04 · 176 阅读 · 0 评论 -
[刷题之旅no7][NOIP2013 普及组] 表达式求值
本质:中缀表达式转后缀表达式,后缀表达式求值本题简化了:换成了只有乘法和加法,而且所有数字均大于0,那真是太简单了点。而且数字大小连int都可以存得小(真是道婴幼儿级别的题目啊,中缀转后缀得难点没了,完了也没有高精度计算是吧。。。)既然这么简单,那就给你设计一个思路就好了。1.读取2.入栈,遇到乘法出栈,出栈的时候要和惩罚后面的结果一起运算,还是不够可以啊,结果入栈,看来还是有点难度我这个思路的难度就是,先把乘法和加法一起入栈,并且把所有数字都转化过来,最后再遍历运算即可。3.把加乘混合表达原创 2021-03-25 18:31:39 · 673 阅读 · 0 评论 -
[刷题之旅no6]后缀表达式
题目要求:读取一段字符,用.划分数字,@代表表达式结束。后缀表达式主要处理思路1.遇到操作数入栈2.遇到操作符把栈顶两个操作数出栈,然后做运算(上面的数字放在右边,下面的数字放在左边)之后,把结果入栈3.如何判断到底是负数还是减号呢?不知道,所以就先不管了。让栈的top从0开始,如果一开始就遇到了-那么直接处理就行了。...原创 2021-03-25 15:36:49 · 166 阅读 · 0 评论 -
[刷题之旅no4]队列安排
由于此题目有固定队列长度,所以用顺序表存储顺序表队列数组宽度2,下标就是编号,数组的值分别为当前编号同学左边的同学和右边的同学处理的时候,直接访问下标,然后像链表一样进行增删改查工作就可以了但是时刻记住,要更新first,最后遍历输出即可附代码#include<stdio.h>int line[100005][2]={0},n=0,k=0,p=0,m=0,move=0,first=1;int main(){ //先把队列输入进去 scanf("%d",&n); f原创 2021-03-24 20:12:15 · 99 阅读 · 0 评论