![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
OJ刷题
文章平均质量分 56
答客诮
自己都不记得啥时候注册的账号了,不过以后还是在CSDN上发博客吧
展开
-
刷题Day18基础贪心之陶陶的苹果
前言 本题真的很简单。P1478 陶陶摘苹果(升级版)。赶着去操场跑步锻炼身体,所以粗略写一下了。解题思路: 本题解题思路相对简单,这道题属于基础的贪心题,一眼就能看出来在做选择的时候需要去贪最小的体力消耗,当然,前提是椅子高度加陶陶臂长之和可以够到这个高度。因此利用体力损耗先排个序,然后去贪最小体力损耗,外加满足高度条件就行,满足一个sum加一次,然后体力s减少一次。输出答案即可。#include <stdio.h>#include <stdlib.h>struct原创 2021-05-07 20:37:18 · 95 阅读 · 0 评论 -
刷题Day18一道优先队列问题
前言 感觉自己最近做的题难度上去了点,但是经过学习,又觉得没那么难了。 还是先放题目来源:P1090 [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G题目理解: 题目抽象过来的意思,如果理解了,会发现它跟霍夫曼编码的过程很像。即,每次给出n个数,需要我们先选出两个最小的数相加,然后将加和放到原序列里并在原序列中去除相加的两个数,同时二者的加和要被记录到一个总和sum里。对新序列重复执行寻找最小的数,相加,把加和加到总和sum里,更新序列,直到原序原创 2021-05-07 20:00:27 · 92 阅读 · 0 评论 -
刷题Day17无权活动选择问题
前言 北航算法分析与设计的mooc讲过这个经典例题,还讲了变种,我觉得挺好的 题目来源:P1803 凌乱的yyy / 线段覆盖直接放代码吧,更详细的思路可以去看开头的mooc,里面不仅讲了经典问题,还讲了变种。#include <stdio.h>#include <stdlib.h>struct node{ int begin; int end;};void Merge(int left,int mid,int right,struct node a[],st原创 2021-05-06 19:37:26 · 64 阅读 · 0 评论 -
刷题Day17基础贪心之排队接水
前言 这道题目是贪心算法最最基础的应用场景之一。 先放出题目来源:P1223 排队接水解题思路: 假设1,2,3,...n1,2,3,...n1,2,3,...n个人接水时间为t1,t2,t3,...tnt_1,t_2,t_3,...t_nt1,t2,t3,...tn,那么,第一个人没有等待时间,第二个人的接水等待时间为t1t_1t1,第三个人的接水等待时间为t1+t2t_1+t_2t1+t2,第四个人的接水时间为t1+t2+t3t_1+t_2+t_3t1+t2+t3,…,第n原创 2021-05-06 18:30:51 · 128 阅读 · 0 评论 -
刷题Day16递归与分治之铺地板问题
前言 这道题是我在学算法分析与设计这门课的时候老师布置的一道作业题,再做的时候有点印象但是又不完全记得了。所以又重起炉灶写了一遍。 先放题目来源:P1228 地毯填补问题题意理解: 首先,是题目会给出一个k值,这个k值会确定下一个2k∗2k2^k*2^k2k∗2k大小的正方形区块。现在题目给出4种地毯形状,即(方便后面用计算机表示了): 第一种方毯 ⇒\Rightarrow⇒ 0111\begin{matrix}0&1\\1&1 \end{matrix}0原创 2021-05-05 23:26:28 · 874 阅读 · 0 评论 -
刷题Day15贪心入门 部分背包问题
前言 从今天起开始做贪心策略相关的题先放题目链接:P2240 【深基12.例1】部分背包问题解题思路: 这个问题的描述其实是部分背包问题。所谓部分背包问题,其实就是背包容量有限,而所拿物品又无限可分,即可以拿部分。这样的话,如果要使得拿的物品价值最大,只要按照价值比给原来的物品排个序,然后拿的时候从最高价值比的物品开始拿如果背包装得下,则全拿;否则只拿填满背包的部分。所以本题做法先利用价值比进行排序然后依次遍历知道背包拿满或者物品拿完为止。#include <stdio.h>#in原创 2021-04-20 19:38:46 · 88 阅读 · 0 评论 -
刷题Day14偶然看到的水题
前言 看洛谷上的个人记录发现一道自己刚学C语言的时候没有解决的一个入门题。因为快到饭点了就随便写写吧,AC了好看点(强迫症)题目链接:P1914 小书童——凯撒密码 不写题解了,就是基本的C语言字符操作。#include <stdio.h>#include <stdlib.h>char str[51];int main(int argc, char *argv[]) { int n,i; scanf("%d",&n); n%=26; scanf("原创 2021-04-14 16:37:28 · 66 阅读 · 0 评论 -
刷题Day14模拟高精度题二
前言 本题是模拟高精度计算斐波那契数列的题,这种类型的题我以前做过类似的,所以不额外写题解了,题解给出以前的链接。 先放题目来源:P2437 蜜蜂路线解题链接: 刷题Day13高精度斐波那契数列本题我的AC代码:#include <stdio.h>#include <stdlib.h>struct node{ int a[1000];};int main(int argc, char *argv[]) { int m,n,i,j; scanf("%d%d原创 2021-04-14 16:21:27 · 87 阅读 · 0 评论 -
刷题Day14基础DP之过河卒
前言 本题是一道基础的动态规划问题,但是因为某些测试的数据最终的结果可能大于int能表示的范围,因此本题做的时候记得开long long int 类型。 先放题目位置;P1002 [NOIP2002 普及组] 过河卒解题思路: 比较明显的DP思路。因为棋盘上的卒想要从(0,0)走到(n,m),最终一共是两种情况,即走到(n-1,m)处然后向右走一步;走到(n,m-1)处然后向下走一步。若记a[n][m]a[n][m]a[n][m]为过河卒走到(n,m)处一共有的方法数,则朴素来看有如下递推关系:原创 2021-04-14 15:00:09 · 108 阅读 · 0 评论 -
刷题Day14fuction(备忘录法)
前言 本题依旧是个很简单的基础题(可能是普及题做多了) 先给出题目位置:P1464 Function解题思路: 本题是一道简单的递归题,而且递归求解方法题目也给了,但是由于存在大量的重叠子问题,因此,当输入的a,b,c稍微大一点,时间开销就会很大。因此,本题主要还是想推荐一个新的思路:备忘录。分析原题目,发现有效的w(a,b,c)只在0≤a,b,c≤200\le a,b,c \le200≤a,b,c≤20范围内有效,所以用一个w[21][21][21]w[21][21][21]w[21][21]原创 2021-04-14 14:14:35 · 132 阅读 · 0 评论 -
刷题Day13高精度斐波那契数列
前言 这题是昨天晚上快到12点的时候AC的,因此没来得及写题解,今天中午补一下题解。 先放题目链接:P1255 数楼梯解题思路: 这题其实还是蛮简单的,记f[N]f[N]f[N]为台阶数为N的时候有的走法数量。先来看三个特殊情况,(1)当N=0的时候,没有台阶也就不存在走的方式(这里会被输入数据卡一下),因此f[0]=0f[0]=0f[0]=0 (2)当N=1的时候,就一种上楼方法,一步到位,因此f[1]=1f[1]=1f[1]=1(3)当N=2的时候,如果先登一步,再登一步,是一种,第二种是一次原创 2021-04-14 12:20:10 · 315 阅读 · 0 评论 -
刷题Day13幂次方
前言 以后文章名字就按照题目名字来发了吧。 先给出题目来源:P1010 [NOIP1998 普及组] 幂次方题目解答: 其实这道题看起来复杂,但是实际上只是一道简单的递归题。具体的做法时,每次对n进行结果搜索时,先找到一个最接近n的2k2^k2k对应的k,然后判断一下,当这个k不为0或者1的时候,则要对k进行递归查找,因此要先输出一个"2(“然后递归搜索k然后输出一个”)";当k为0或者1的时候,可以直接输出"2"或者"2(0)",然后用n减去2k2^k2k得到一个余数n’.当余数不为0的时候,说原创 2021-04-13 20:07:26 · 91 阅读 · 0 评论 -
刷题Day12小A点菜(动态规划)
前言 看到这道题以后第一反应是基础递归策略,但是被hack数据卡了时间以后才想到,用DP才能过,否则会被一直卡时间复杂度。毕竟递归下去的时间复杂度为O(2n)O(2^n)O(2n).。 先放题目位置:P1164 小A点菜下面这个是关键:然后这里可以放一下这个hack数据:所以,递归来做肯定是会TLE的递归式的得出: 因为有两个变量,N,M这两个变量分别代表了有的菜品个数,以及手上有的钱;这样的话记f[N,M]为在第1到N道菜品中,手上有M元的时候一共可选的方案总数。初始当N=0或者M=0的原创 2021-04-12 23:18:59 · 204 阅读 · 0 评论 -
刷题Day12卡特兰数
前言 开头以为是个暴力搜索的过程,本来想问递归;但是回想一下,感觉递归来做好像时间复杂度会很高,因为有重叠的子问题在里面,然后就想起来用动态规划来做。推导完DP表达式以后发现这是卡特兰数。 题目来源:P1044 [NOIP2003 普及组] 栈题意理解: 本题的题目重点不是栈,而是借着栈来表达一种做法。初始一共分为三个部分,输入序列,中间的栈以及输出序列。输入序列上是1-n这n个数字的排列,然后这n个数字可以进入入栈操作;入栈后的数字可以进行出栈到输出序列上的操作。当输入序列和栈皆为空的时候,输原创 2021-04-12 21:48:36 · 76 阅读 · 0 评论 -
刷题Day12又一个基础递归搜索
前言 本题属于比较基础的递归搜索策略,因为此类题目刷的比较多了,所以不做太多讲解P2392 kkksc03考前临时抱佛脚解题思路: 本题的题目有点长但是题意还是比较容易理解的。可以简单理解为对这四列中的每一列,分为两个子列并计算子列的和,最大的子列和代表这列贡献的时间然后算四列时间的加和。 依旧是比较基础的递归搜索策略,因为无序回溯,所以每次向下递归的时间只要用两个变量total_right和total_left即可记录下当前左右子列的和,并且向下递归计算将当前数归入左子列和右子列的情况,当递原创 2021-04-12 16:03:10 · 62 阅读 · 0 评论 -
刷题Day11递归搜索
前言 最近做递归搜索相关的题目感觉刷出手感了,哈哈。 先放题目链接:P2036 [COCI2008-2009#2] PERKET解题思路: 基础的递归搜索策略。在这里,我选择利用search函数来递归,其具体的含义是,在ingred[]数组的left到right区间上,当前已经选择好的配料的总酸度为total_s,总苦度为total_b时的最小差值。初始即为从0到n-1上搜索,初始的总酸度为1,初始的总苦度为0。每次进入递归以后,先判断是否越界,即left是否已经大于了right。是的话则表示无原创 2021-04-10 22:07:01 · 86 阅读 · 0 评论 -
刷题Day11模拟高精度+康托展开
前言 这题一开始被思维定式了,以为用普通的数学方法就能过,后来后知后觉发现这里要是直接用数学方法的话,这个所涉及的整数会达到10000!10000!10000!。所以不可避免的会WA。然后发现其实这题是个模拟高精度的题,也就是自己模拟高精度计算。虽然不知道为什么会把这种模拟高精度的问题放到暴力搜索专题下。但是这道题目确实还是有点东西的,因此个人感觉还是有必要好好写下题解。 先放题目来源:P1088 [NOIP2004 普及组] 火星人题意理解: 这题题目描述很长,但是抽象出来的描述是这样的:原创 2021-04-10 20:14:20 · 83 阅读 · 0 评论 -
刷题Day10全排列输出问题
前言 最近做递归搜索做的来劲了,一开始碰到这个全排列输出问题还以为递归不好做,后来想了想还是能做,于是就利用递归过了这道题。还是先放题目链接:P1706 全排列问题解题思路: 初看题目,本质上是求数学上的全排列,也就是把AnnA_n^nAnn按照它要的顺序打印出来。所以没啥卡思路的。但是就是这个如何打印是个问题。如果说,n是固定的,那么n重for循环就可以解决了,很轻松。但是这里n不固定,也就是说for循环重数不固定。我的解决方法还是递归搜索;题解区有位小伙伴很好的解答了我的问题,但是我自己却不原创 2021-04-08 16:17:56 · 91 阅读 · 0 评论 -
刷题Day10基础组合输出问题
前言 经过10天的刷题感觉自己的coding能力确实提升了一点。先放题目来源:P1157 组合的输出解题思路: 解题讨论类似我的上一篇题解。也是递归解决。刷题Day10基础递归策略但是也稍稍有点不同,具体在于这次是要记录下寻找过程,而且待记录的内容是个变长数组。所以,额外开一个变长数组b[r]也是必要的。 基本的递归思路和上篇一致,也是当面临从1到n的数的时候,选与不选导致两种递归情况,然后依次递归下去输出就行了。所采用的递归策略类似深度优先搜索,这样又保证了数据输出顺序符合题目要求。直接放我原创 2021-04-08 14:01:10 · 80 阅读 · 0 评论 -
刷题Day10基础递归策略
前言 这几天做了不少普及题感觉自己还是有进步的(相对大一时候的我,那时候不敢做普及题哈哈哈)依旧是先放题目来源:P1036 [NOIP2002 普及组] 选数解题思路: 这题如果是个数学题的话,其实就是先找出n个数中k个数组成的不同组合,然后计算加和,判断加和是不是素数就行了。但是在这里需要编程解决,因此,主要解决的就是两个问题,一个是搜索所有k个数的组合;另一个是判断这k个数的加和是否是素数。判断是不是素数是个基本功我就不说了。然后就是搜索k个数的组合。在这里,我采用的是递归的思想。具体来说就是原创 2021-04-08 13:22:23 · 62 阅读 · 0 评论 -
刷题Day9_3又是暴力枚举
前言 目前在做暴力搜索的专题,学到了一个新方法;然后做了这道题P1618 三连击(升级版)解题思路 解题套路感觉差不多,就是利用9个for循环去枚举所有可能的情况,然后在最底层的循环处判断是否满足条件再去打印输出。直接上代码了:#include <stdio.h>#include <stdlib.h>int main(int argc, char *argv[]) { int A,B,C,a,b,c,d,e,f,g,h,i,m1,m2,m3,is_have=0;原创 2021-04-07 21:31:17 · 58 阅读 · 0 评论 -
刷题Day9_2搜索
前言 这道题我不太会写,看了题解觉得这个思路很巧,就想记下来。先放题目链接:P2089 烤鸡别人的代码:#include <stdio.h>#include <stdlib.h>int main(int argc, char *argv[]) { int n,a,b,c,d,e,f,g,h,i,j,x=0; scanf("%d",&n); if(n>30){ printf("%d",0); }else if(n<10){ prin原创 2021-04-07 20:45:32 · 44 阅读 · 0 评论 -
刷题Day9统计方形
前言 前段时间放假就没怎么刷题了,今天开始继续刷题。先放题目链接:P2241 统计方形(数据加强版)我的解题思路: 本题被洛谷归在了暴力枚举门类下,作为小白,一开始我还是踩坑了的。开始我还真一个点一个点枚举过来然后算长方形和正方形数量,然后不出意外的TLE了。所以看似是暴力枚举,但是其实是有技巧在其中的。 我最早想到的技巧的动态规划。假设D1(u,v)表示长宽分别为u和v的矩形包含的正方形数量,那么求D1(u,v)可以通过D1(u,v)来求。理论上确实可行,但是这里n和m取值为1-5000,这样原创 2021-04-07 19:55:20 · 128 阅读 · 0 评论 -
刷题Day8结构体排序
前言 趁着上公选课,又刷了道题,思路依旧简单。 先放题目链接:P5143 攀爬者解题思路: 看到题目第一想法,就是拿一个结构体分别存坐标x,y,z的值,然后直接根据z的值从小到大给结构体排序。然后从1到n-1依次向前计算欧氏距离,加和得到结果。因为这里精度要求是double类型所以就开一个double类型的数字来存这个距离的加和。然后注意题目输出要保留三位小数,所以输出的时候要用%.3f来控制输出精度。 给出我的AC代码:#include <stdio.h>#include &原创 2021-03-30 19:20:14 · 77 阅读 · 0 评论 -
刷题Day8多属性排序
前言 这题是我大一就做过的,奈何自己当时水平太低结果当时就只拿了10分;现在大三20minAC,感觉还是有点进步的哈哈哈…题目链接地址:P1068 [NOIP2009 普及组] 分数线划定解题思路: 题目初看一大串文字表述很复杂,其实并不复杂。这道题要做的人物就是先把n个志愿者的成绩按照它已经指定好的方式排序,然后将录取人数*1.5利用向下取整(对应在C语言里是直接进行强制类型转换),在排好序的数组上找相应位置那个志愿者的分,然后看是否有同分情况有就顺延然后确定正式进入面试的人数,然后再按照被确原创 2021-03-30 18:50:32 · 59 阅读 · 0 评论 -
刷题Day8欢乐的跳
前言 现在睡醒了,但是想把洛谷排序题单专题刷完,所以就依次顺序做下来了。一看又是个水题。 题目出处:P1152 欢乐的跳 题目意思也比较简单,就是给你一组n个数,让你在连续两个数之间作差并取绝对值,也就是离散微分。n个数,也就有n-1个差值,并且要取绝对值。然后如果这n-1个差值正好是1到n-1,那么就是"Jolly",否则就是"Not jolly",注意Jolly和jolly的大小写问题(又是一个极小的细节)。解题思路: 思路依旧简单。先作差,得到这n-1个数,第一种办法就是额外开一个数组,但是原创 2021-03-30 14:04:33 · 88 阅读 · 0 评论 -
刷题Day8贪心加排序
前言 刚睡醒,迷迷糊糊,所以打算做道水题提提神。 老规矩,还是先放链接:P2676 [USACO07DEC]Bookshelf B 题目意思还是比较简单的,翻译过来就是N头奶牛有a[N]个身高数据,我们要找最少数量的a[i]和,使得和大于书架高度B。讲白了就是贪心+排序的思想。因为想要让最少的a[i]填充B,只能贪最大的身高。 这样的话,问题就转化成依次找最大的身高,这里可以用选择排序,依次找最大直到加和大于书架高度B,也可以一遍遍的做冒泡排序,直到浮到最上层的加和大于B。也可以选择排个序,然后从原创 2021-03-30 13:39:17 · 102 阅读 · 0 评论 -
刷题Day7第二题模拟高精度排序
前言 学到了一种从重定向输入数据的方法(但是好像大一学C语言那会儿就应该要会可惜我没学哈哈哈我大意了啊)freopen("同一文件夹下的文件名","r",stdin) 就是当你发现你WA了之后去下数据集,把输入数据集当初txt文件放到相应.c文件的目录下,可以利用文件读入输入数据而不必自己手动输入(发现之前之前手动输入数据集还真蠢....)言归正传,先放题目来源P1781 宇宙总统 估计读完一遍题目,很多人想的都是,我int取票数,拿结构体存序号和票数然后排序不就完了吗?对,那确实完了。我一开始原创 2021-03-29 17:08:15 · 73 阅读 · 0 评论 -
刷题Day7多属性排序
前言 此题很水。先放链接:P1093 [NOIP2007 普及组] 奖学金题目内容如下:这题很水,因为输入规模小,思路还简单。我的解题思路: 因为是多属性的排序,即需要从总分,单科以及学号三个角度进行排序,所以如果像我一样用C语言刷题的话,这里需要用到结构体来存这三个信息。然后由于只需要前五个同学的学号和总分情况,而不必关心其余的同学是什么样的。因此,如果用谋者排序模板全都排出来然后截取前五个,个人感觉有点大材小用而且也浪费了时间。所以在这里我借助冒泡排序的思想来解决这道题目。即每趟排序按总分原创 2021-03-29 14:28:11 · 94 阅读 · 0 评论 -
刷题Day6_排序模板
前言 这几天开始在做普及题,因为打算做一些专项练习,如排序,二分,树,图…所以每一段时间做的题类型基本差不多,写的题解思路和方法也差不多。先给出题目:P1271 【深基9.例1】选举学生会咋一看不知道题目想说什么,但是其实题目中的n我觉得没啥意义。其实就是让你对后面的m个数排个序。关于排序,我之前归纳过一些模板,就是快速排序,归并排序和堆排序的模板。链接在此:排序小总结这里的题目,读入m个数后我还是采用归并排序来做,因为归并排序的时间复杂度比较稳,是O(nlogn),而不像快速排序那样可能会被逆序原创 2021-03-27 15:33:09 · 49 阅读 · 0 评论 -
刷题Day6_寻找第k小数
前言 终于打算写点普及难度的题,看到一个跟分治思想有关的题目,就打算去写写试试。写放题目位置:P1923 【深基9.例4】求第 k 小的数解题思路 这题的解题思路有很多,例如(1)你可以先给读入的数组排序,然后选择第k个数作为答案打印出来,这样肯定也是对的。我归纳了三种排序算法的模板,快速排序,堆排序和归并排序,链接在此:三种排序算法(2)在前述排序的基础上,你也可以不进行完全的排序。这就是说,既然我要的是第k小数,那么我不断从最小的第0小数开始找,直到找到第k小数不就行了吗?理论上可以,但是如原创 2021-03-27 15:02:31 · 75 阅读 · 0 评论 -
刷题Day5排序小总结
前言 写给自己的话: 由于刷普及题发现,很多题可能需要数列有序;或者是要将某些操作嵌入到某种排序里,因此今天对三种常见的排序,快速排序,归并排序,堆排序做了个总结,以及写了自己可以用的模板,以后可以套着用。#include <stdio.h>#include <stdlib.h>void quicksort(int left,int right,int a[]){ //快速排序模板 if(left>=right) return; int k=a[原创 2021-03-26 20:15:30 · 70 阅读 · 0 评论 -
刷题Day5_排序
开始做了点普及难度的题,感觉对我这种OJ新手确实有点难度先放出链接:P1177 【模板】快速排序题目描述如下:其实就是个模板题,让你写个快速排序的模板。原创 2021-03-26 16:31:28 · 68 阅读 · 0 评论 -
刷题Day4_3_预排序
今天时间比较多,又刷了一道水题依旧先给出题目链接:P1296 奶牛的耳语题解思路在这里先提醒一句:千万别被数据输入样例给骗了!这题其实很容易写,假如输入序列是有序的,那么只要对每一个数据点,依次从小到大遍历,直到找到大于d的数据点的位置,得到一个numinum_inumi,然后依次累加得到最终的。但是,这个有序的前提是不满足的,因此需要我们自己先对输入的数据进行一个排序。在这里,得到numinum_inumi我用的是蛮力枚举,单次复杂度是O(n),总的时间复杂度是O(n^2),也可以用二分查原创 2021-03-19 21:02:32 · 87 阅读 · 0 评论 -
刷题Day4_2_贪心策略
刷题Day4_2之又做了一道水题题目来源: P1181 数列分段Section I题解思路: 题目里有如下几个关键信息: (1)连续若干段 (2)每段和被限制在M 由这两个关键的信息就能判断出,本题应该是利用贪心的思想来解决。首先,其解法具有最优子结构的特征,因为要连续选取,因此,当选出最优的一段以后,剩下的子段里依旧面临相同问题并且原问题得到的最优选择也是子问题合并后的最优选择。同样地,本题也具有贪心选择的性质,即每次选到最大的不超过M的一段,就能保证最终得到的子段数量最少(太明显了)原创 2021-03-19 17:17:33 · 85 阅读 · 0 评论 -
刷题Day4_模拟
刷题Day4(依旧是菜鸡打小怪兽的一天题目依旧来自洛谷入门题,下面给出链接:P1179数字统计解答思路: 思路很朴素,这里原创 2021-03-19 16:53:15 · 62 阅读 · 0 评论 -
刷题Day3_求逆序数对总数
刷题day3写在开头的话打算从今天起记录自己的刷题历程。因为开始的几天是从简单题开始的,没多少意义,因此还是打算从可以写点东西的题目开始。题目:洛谷P1116车厢重组自己的解答可能很多刚开始刷题的小伙伴们跟我一样会纠结这个最少旋转次数怎么求。但是实际上,考虑题意,其实本质上是在一列数中不断交换相邻的数让原本无序的数列变得有序。如此的做法,想到什么没? 没错,就是逆序对。为啥是逆序对我不想解释了,因为有点晚了,舍友都睡了,不想写太多影响他们休息。总之,这道题的本质就是求解逆序对。解答1:最容易原创 2021-03-19 00:54:15 · 216 阅读 · 0 评论