题解
Rem_Inory
这个作者很懒,什么都没留下…
展开
-
【题解】 洛谷P1598 垂直竖状图(模拟 字符串)
纯模拟即可。运用gets读入一整行字符,并记录其中每个字母出现的个数。读入完毕后记录下最多的字母出现的个数。然后从那个数开始循环,内层对每一个字母进行判断,如果比它小就输出空格,否则输出星号+空格。最后一行输出字母+空格即可#include<cstdio>#include<iostream>#include<cstring>#include<...原创 2018-07-23 11:10:17 · 360 阅读 · 0 评论 -
【题解】洛谷P1070 道路游戏(n^3)
原题数据范围比较诡异,最后一个点明明n^2才能过,结果n^3也过了,所以写一下这个做法吧。设一个数组dp表示一定时间内能获得收益的最大值,to[i][j]表示从第i时刻到第j时刻所获收益的最大值,可以得到状态转移方程dp[i]=max(dp[i],dp[j]+to[j][i])。对于数组to[i][j],为了求它的最优情况,我们可以通过循环来解决,由于读入时对于在m时刻获得的金币我们用一个...原创 2018-07-17 20:14:44 · 279 阅读 · 0 评论 -
【题解】洛谷P2051 中国象棋(状压dp)
30分做法拿到这种题一开始肯定没有思路,而30分的数据比较小,所以我们可以暴力解决。dfs函数x代表行数,b[i]代表第i列有多少个炮了,我们知道如果某一列有两个炮,那那一行里的这一列一定不能再放炮了。分别循环表示一行里不放炮、放一个、放两个的情况,然后计算得到结果,可以解决30分。#include<cstdio>#include<iostream>#incl...原创 2018-07-17 20:30:14 · 353 阅读 · 0 评论 -
【题解】洛谷P1169 棋盘制作(栈,dp)
想要解决这个问题,我们不妨看一个类似的问题,就是给你n个数,代表位置n上积木的高度,求其最大面积。为了让时间复杂度控制在 O(N)之内,我们需要用栈来解决这个问题。设定h[n+1]=0来让栈最后里面的元素可以自动退栈,栈里存放高度的单调递增序列的坐标,当读入的高度比栈顶元素高度小时,那就记录下栈顶元素的高度,用当前坐标减去栈顶元素底下元素的坐标+1得到宽度,相乘记录最大值,然后将栈顶元素出栈,重复...原创 2018-07-17 20:40:21 · 210 阅读 · 0 评论 -
【题解】洛谷P1233 木棍加工(贪心)
这个题给的标签是dp,然而有很简单的贪心策略可以解决,类似导弹拦截问题。首先结构体排序长度,然后求其最长不上升子序列的个数就可以了。遍历整个数组,如果没被访问过答案就+1,设置序列最小值为当前的宽度,然后从i+1到n循环,如果比它小并且没被访问过,就给其打上标记,并将最小值下放,最后输出答案即可。#include<cstdio>#include<algorithm&g...原创 2018-07-17 20:49:05 · 525 阅读 · 1 评论 -
【题解】洛谷P1373 小a和uim之大逃离(dp 递推)
题目背景小a和uim来到雨林中探险。突然一阵北风吹来,一片乌云从北部天边急涌过来,还伴着一道道闪电,一阵阵雷声。刹那间,狂风大作,乌云布满了天空,紧接着豆大的雨点从天空中打落下来,只见前方出现了一个披头散发、青面獠牙的怪物,低沉着声音说:“呵呵,既然你们来到这,只能活下来一个!”。小a和他的小伙伴都惊呆了!题目描述瞬间,地面上出现了一个n*m的巨幅矩阵,矩阵的每个格子上有一坨0~k不等...原创 2018-07-11 22:52:00 · 243 阅读 · 0 评论 -
【题解】洛谷P1005 矩阵取数(dp 高精)
2007年NOIP提高组第三题 难度还是比较大的首先来看一下题意: 题目描述帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的 n \times mn×m 的矩阵,矩阵中的每个元素 a_{i,j}ai,j 均为非负整数。游戏规则如下:每次取数时须从每行各取走一个元素,共 nn 个。经过 mm 次后取完矩阵内所有元素; 每次取走的各个元素只能是该元素所在行的行首或行尾; 每次...原创 2018-07-11 22:36:10 · 759 阅读 · 1 评论 -
【题解】洛谷各种字符串问题合集(持续更新中)
洛谷 P1449 后缀表达式这道题需要手动模拟栈的操作。读入字符,当字符不为终止字符@时,如果读入的是数字就用now记录下它的值,如果读入的是 . 就将得到的数字值放到栈顶,并清空now。当读到运算符时,就拿栈顶元素下面的第一个元素和栈顶元素进行加减乘除的操作,并将栈顶清空,元素退栈,最后输出栈内剩下的唯一元素即可。要用long long#include<iostream>...原创 2018-07-23 17:13:39 · 1575 阅读 · 0 评论 -
【题解】ACM Rock-Paper-Stones (前缀和)
一开始想写暴力但毫无思路。。不过我们可以把问题化简,假如给你知道了x,y,z,该如何计算两个人的胜利情况?我们设第一个人为小A,第二个人为小B,小B要出的招式已经在输入里给出了,现在我们得对小A的应对策略进行操作,我们会想到利用前缀和来解决这个问题。初始化三个前缀和数组sumS、sumP、sumR为0,代表小B的招式里出的剪刀 布 石头 的个数,我们扫一遍小B读入的字符串,如果读到某一个位...原创 2018-07-23 17:22:12 · 419 阅读 · 0 评论 -
【题解】洛谷P2577 午餐(dp,排序)
https://blog.csdn.net/qq_36288976/article/details/79343492这个题解说的个人觉得是最方便理解的一个。。。将第i个人放在1号窗口:if(j>=s[i].a) f[i][j] = min(f[i][j], max(f[i-1][j-s[i].a], j+s[i].b));f[i-1][j-s[i].a]是i-1号人打饭+吃饭的...转载 2018-07-17 21:55:03 · 172 阅读 · 0 评论 -
【题解】洛谷 P1311 选择客栈(递推)
方法一:暴力枚举第一个客栈、第二个客栈以及两个客栈之间的客栈,寻找合法的条件,答案++。理论上也就30分吧,结果60分。。。贴一下代码#include<cstdio>#include<iostream>#include<cmath>#include<algorithm>using namespace std;const int max...原创 2018-07-23 21:41:13 · 327 阅读 · 0 评论 -
【题解】洛谷 P1190 接水问题(贪心 模拟)
这个题思路还是很好想的。对于当前m个水龙头的所有人,找到其接水时间最短的那一个,答案+=那个时间,然后将m个水龙头前所有人的时间减去那个时间,将下一个接水的那个人放到那个位置 重复上述操作。注意需要n-m次,因为到了n-m+1次时就没有人等待接水了,这时我们应当给答案加上在接水的人当中时间最长的值。我的代码略显复杂。。不过思路还是比较明显的。 #include<cstdio>...原创 2018-07-23 21:45:08 · 568 阅读 · 0 评论 -
【题解】洛谷 P1199 三国游戏(贪心)
这道题给我的第一感觉就是贪心,选出每一行的最大默契度的那个武将,电脑肯定会选择和那个默契度匹配的另一个武将,这时候我们能获得的最大默契度就是该行次大默契度的武将,对于每一行的次大默契度比较出最高的,就是能获胜的最大默契度。注意我们一定能战胜电脑,因为电脑是按照我们的策略办事,能获得的最大默契度也就是次大的,但次大的已经被我们选了,所以不需要判断能不能获胜。#include<cstdio...原创 2018-07-23 21:47:35 · 331 阅读 · 0 评论 -
【题解】洛谷P1202 黑色星期五(模拟)
思路可能有 但实现起来可能无从下手,那我们就简单模拟一下整个过程吧。首先需要手写月份表,注意把12月放在最前面,这样后面的月份是正确的。由于1900年的第一个13号是周三,所以我们初始化一个last为3。读入n年,从1900年循环到1900+n-1年,如果判断出来当前年份为闰年(i%400==0 或者 i%100!=0(不是世纪年)且i%4==0 ),那么我们需要把月份表中的2变为29天,对每...原创 2018-07-23 22:18:22 · 502 阅读 · 0 评论 -
【题解】洛谷P1341 无序字母对(图的遍历、欧拉回路)
欧拉回路当一个无向图中每个点的度数都为偶数时,此时从任何一个点开始遍历都可以经过所有边到达其他点并最后回到原点,我们称这样的回路叫欧拉回路。如果一个无向图内点的度数有且仅有两个奇数,那这样的图称作欧拉通路,从这两个点出发可以遍历图的所有边,但最后回不到原点。除了这两种情况之外,其他情况从任意点出发都无法遍历整个图的所有边那么这个问题就是求最小字典序的欧拉回路或欧拉通路,我们先写两个函数用于...原创 2018-07-18 21:20:06 · 204 阅读 · 0 评论 -
【题解】P2661 信息传递(tarjan)
这道题用来解决的方法很多,最近学了tarjan,所以我们不妨用tarjan来解决。我们将这个关系用有向图的方式存下来,那么答案就是这个图里最小的环的大小。对于tarjan数组,我们记录dfn代表时间戳,low代表其强连通分量中的根的时间戳(大概吧)。初始化dfn=low=++index,然后把这个点存进栈内,把代表访问过的b数组和在栈内的instack数组都标记为true。邻接表对该点所连的店...原创 2018-07-18 21:34:28 · 150 阅读 · 0 评论 -
【题解】P2341 受欢迎的牛(tarjan缩点)
这个题运用到了缩点技巧,tarjan里我们记录下缩后的点的序号,对于每一个强连通分量来说,当栈顶元素不等于根节点时,我们将其出栈,记录下那个点的染色数组=新序号,并将新序号所包含的节点个数++(也就是记录这个强连通分量里有多少个结点);由于强连通分量里的每个数都可以互相到达,那他们所代表的牛都是互相爱慕的,可以缩点。对于每一个染色后的结点,我们求他不包含缩点后的强连通分量的出度,并记录这个出度为0...原创 2018-07-18 21:48:40 · 198 阅读 · 0 评论 -
【题解】codevs P2822 爱在心中(tarjan缩点)
该题思路类似洛谷P2341 受欢迎的牛,大部分内容可以参照上一篇题解,这里不再重复。但注意我们记录出度为0的点时还要判断它是一个点还是一个缩过的点,因为只有爱心天使(缩过的强连通分量)才能被别人爱慕。记录下有多少个爱心天使(cnt[i]!=1),并按照题意操作即可。最后输出强连通分量里的点时注意枚举1-n所有点,判断它染色后是不是出度为0的那个点,如果是就输出即可。 #include&l...原创 2018-07-18 21:57:03 · 160 阅读 · 0 评论 -
【题解】P2921 在农场万圣节(tarjan)
这个题可以用tarjan解决,将染色后的点标记为tarjan的那个点,特判如果出发点等于目标点 答案就是1,如果要求的那个点在强连通分量里面,我们就输出其所含的cnt(也就是强连通分量所代表的环的大小)。如果目标点不在强连通分量里,我们就从该点进行扩展,记录下扩展的步数step。如果扩展到一个强连通分量内,答案就是step+该强连通分量的环的大小,break掉即可。最后输出每一个点的答案。#...原创 2018-07-18 22:08:34 · 238 阅读 · 0 评论 -
【题解】洛谷P1119 灾后重建(floyd)
这是一个有条件的最短路问题,当时间为t时某个村庄才会被修好,修好的村庄之间的路才能贯通、求最小路,那么我们就记录t数组,在floyd前提条件下判断中间点村庄修好的时间是否小于等于给的时间,得到最短路。如果开头结尾村庄修好的时间比给的时间小或相等,并且开头和结尾的村庄有边相连,那么就输出最短路的答案,否则输出-1 #include<cstdio>#include<ios...原创 2018-07-18 22:13:42 · 264 阅读 · 0 评论 -
【题解】洛谷P1552 牛的旅行(floyd)
这道题乍一看非常头疼,但仔细读完题之后,我们明白它其实想让我们求两个牧场间最小可能的直径。对于直径的定义就是牧场中最远两个牧区之间的距离,而这个距离指的是最短路的距离,那么我们将直径分开来求。先跑一边floyd计算两个点之间的最短路,然后记录在同一个牧场内假如以一个点作为道路构建的一个出发点,在该牧场内离这个点最远的那个点的距离(同一个牧场内的牧区是两两互通的)。然后我们再处理道路相连的情况,枚举...原创 2018-07-18 22:23:25 · 323 阅读 · 0 评论 -
【题解】洛谷P2279 消防局的设立(dfs/贪心)
这道题虽然在洛谷上归类为动态规划(树形dp),然而思考后我们可以用贪心来解决这个问题。由于我们得到的是一个树形结构,所以我们可以模拟出这么一棵树来,然后通过dfs求出树每一个叶子结点的深度(根节点深度最小为1)。注意用dfs求深度要记录下结点的父亲结点,后面有用。因为消防局可以扑灭和它所在城市距离为2的城市的火灾,所以我们贪心,将求出的最深的节点找到,然后通过fa数组寻找其爷爷结点,并将其标记...原创 2018-07-13 22:13:26 · 327 阅读 · 0 评论 -
【题解】P1064 金明的预算方案(背包)
在解决这个问题之前,我们先把背包的相关问题的解决过一遍。对于01背包(每件物品只能用0或1次):for(int i=1;i<=n;i++) for(int j=v;j-w[i]>=0;j--) dp[j]=max(dp[j],dp[j-w[i]]+c[i]);对于完全背包(每件物品使用数目不限):for(int i=1;i<=n;i+...原创 2018-07-13 22:26:44 · 200 阅读 · 0 评论 -
【题解】vijos P1037 搭建双塔(背包)
可以将该问题转化为两个01背包,然后求他们相等且和的最大值。二维数组dp[x][y]代表两座塔高度是否合理,初始化dp[0][0]=1.利用三重循环得到递推公式:若dp[x-w[i]][y]==1或dp[x][y-w[i]]==1可以推出dp[x][y]=1。从高度之和一半循环到1判断dp[i][i]==1就输出i,否则输出"Impossible"#include<cstdio>...原创 2018-07-13 22:32:12 · 269 阅读 · 0 评论 -
【题解】vijos P1059 积木城堡(背包)
读入数据,二维数组w存第i组城堡的第j块积木的高度(我写的时候把组数放在后面),h数组记录第i组共用了多少积木,求出最少的一组总积木的高度。初始化高度为0时dp为1,利用和之前某题类似的方法,判断这么多积木能不能搭成目标。循环判断n组内有一组dp为0就不行,否则输出答案。再否则输出0.#include<cstdio>#include<iostream>#inclu...原创 2018-07-13 22:39:37 · 417 阅读 · 0 评论 -
【题解】vijos P1071 新年趣事之打牌
相对复杂的背包问题。首先注意是判断组成总质量-剩下牌总重量的组成。利用类似的判断背包内数字组合的方法,只不过这次不是判断能不能组合而是求组合数目,利用这个数目=0就输出0,>1就输出-1可以AC6个点。对于=1时求牌编号的情况,由于这种情况一定是唯一的,所以我们可以在求组合数目的时候就用fa数组记录下一个质量的上一个质量,用num数组记录这个质量由上一个质量推过来的编号。注意要判断编号被覆盖...原创 2018-07-13 22:46:12 · 256 阅读 · 0 评论 -
【题解】vijos 最高的牛
仔细观察数据可以发现,如果要求可能最大的每头牛的高度,只需要将给出的区间(注意是开区间)内的数减去1就行了。然而只能得50分。因为还要判断一下是否之前输入过这个区间,否则会重复减去。当然 上面的做法并不是最优,因为数组开的太大了,只是由于在线评测你用多少空间机器给你多少空间,正式比赛会全部MLE。我们还有判重的优化做法。就是将读入的区间存在结构体里,并将结构体按照x大小排序,在做减法之前,我们...原创 2018-07-28 14:48:34 · 167 阅读 · 0 评论 -
【题解】洛谷P1965 转圈游戏(快速幂 模拟 数学)
稍微思考我们不难得到答案的表达式为(x+m*10^k)%n,然后由于k给的非常非常大,我们这道题就需要用快速幂了。快速幂是啥可以自己尝试写一写。再就是注意对于取模问题,我们每做一次加法或乘法时都需要进行取模,为了防止加起来的数超过mod,所以这道题答案应当是(x%n)+(m%n)*(10^k%n) 对快速幂的取模操作直接在函数里进行,最后在输出答案时还要取模,因为两个比模数小的数加起来有可能比模数...原创 2018-07-28 14:52:53 · 310 阅读 · 0 评论 -
【题解】vijos P1250 最勇敢的机器人(并查集 背包)
这道题其实是一道分组背包问题,因为将某两件物品放在一起会爆炸,并且爆炸具有传递性,所以我们可以用并查集来合并这些会爆炸的物品的编号,构成许多组,然后就可以用分组背包模板做了。fw、fp二维数组存其组号和对应的第几个箱子的大小 价值,0表示这一组里共有多少箱子。#include<cstdio>#include<iostream>using namespace std...原创 2018-07-14 21:01:16 · 207 阅读 · 0 评论 -
【题解】洛谷P1309 瑞士轮(归并排序)
看了一眼数据大小,我们可以知道用快排肯定会TLE,自己手写模拟试了试,果真只得了60分,因此我们需要改进排序算法。这里我们可以用归并排序(时间复杂度O(N)),归并排序的思想就是对两个有序的数组进行操作,然后开另一个数组为两个数组大小之和。设两个指针p1,p2,开始初始化为1。当两个指针中的任何一个没有到最后时,就比较指针所指的数,将更大的数进入第三个数组,然后把该数所在的原数组的指针后移,反...原创 2018-07-28 21:03:51 · 250 阅读 · 0 评论 -
【题解】洛谷P1098 字符串的展开(模拟 字符串)
就按照给你的指令去做就好了,这里提几个坑点:1.两个数字连一起是要判断的。。。我没判断WA10分2.两个“-”连一起也要判断。。。 10分3.有可能一开始或结尾就是“-”; 20分4.如果你在洛谷上评测,很有可能零分,因为其数据读入极其不规范。你需要手动过滤掉多余的字符。写的还是比较繁琐的,但能看懂#include<cstdio>#include<ios...原创 2018-07-25 22:21:47 · 263 阅读 · 0 评论 -
【题解】洛谷P1022 计算器的改良(模拟 字符串)
https://www.luogu.org/blog/Asukaaa/solution-p1022这里注意一下判断某个数组等于零和其等于false是不一样的。。。。#include<cstdio>#include<iostream>#include<cstring>using namespace std;char ww;double sz=0...原创 2018-07-25 22:25:56 · 310 阅读 · 0 评论 -
【题解】洛谷P1061 Jam的加减法(模拟 字符串)
假如后继的空位没了 就搜索前一位,空位是根据总数-当前的字母来定的,应当比队尾-队首+1大或相等#include<cstdio>#include<iostream>#include<cstring>using namespace std;int s,t,w;char ss[10010];void ff(){ for(int i=w;i>...原创 2018-07-25 22:30:52 · 182 阅读 · 0 评论 -
【题解】NOIP2012 提高组day1 T2 国王游戏(贪心 高精)
下面给出贪心做法的证明: left rightk x yp1 x1 y1 或 针对这种情况 我们得到ans1=max(x/y1, x*x1/y2)p2 x2 y2 left rightk x yp...原创 2018-07-14 21:13:28 · 289 阅读 · 0 评论 -
【题解】 NOIP2012 提高组day1 T3 开车旅行(倍增 dfs 模拟) 70分做法
倍增没有学,不过我们可以通过模拟和dfs得到70分的部分分。手写dis函数求两个城市距离=海拔差的绝对值。设一个km[i][2]的二维数组,来记录离i个城市距离最近和第二近的城市,要注意题目里有许多细节。例如距离相同时判断海拔低的城市更近。设m2 m1为0代表离i次近和最近的城市,循环城市i,再循环j(i+1 到 n),如果满足上述条件,就用j更新m1,m1更新m2。当然存在j不是最近但能更新...原创 2018-07-14 21:35:05 · 191 阅读 · 0 评论 -
【题解】vijos P1198 最佳课题选择(背包)
没啥好说的。注意long long,将a*x^b记录到数组c[i][k]中,i代表第i个课题,k代表这份课题写了多少篇论文,初始化dp,求在范围内的dp最小值即可。#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>#define ll long l...原创 2018-07-14 21:38:50 · 164 阅读 · 0 评论 -
【题解】vijos P1159 岳麓山上打水(迭代加深搜索 背包)
读入水桶种类后,先对其容量从小到大排序,然后从选1个水桶到选p个水桶枚举,dfs迭代搜索。dfs(i,j)表示剩下i个水桶,从j号水桶开始向下搜索(这样可以减少复杂度,迭代的思想,避免重复计算)。安排上某个水桶就给它打标记,用这个标记写dp判断现有水桶能否组合成答案。#include<cstdio>#include<iostream>#include<alg...原创 2018-07-14 21:44:18 · 216 阅读 · 0 评论 -
【题解】洛谷P1645 序列(差分约束)
https://blog.csdn.net/largecub233/article/details/73995862#include<cstdio>#include<iostream>using namespace std;const int maxn=100010;int head[maxn],nnext[maxn],to[maxn],team[maxn],...原创 2018-07-29 07:16:01 · 195 阅读 · 0 评论 -
【题解】洛谷P2484 打地鼠(模拟)
对于锤子的大小,我们可以枚举。然后模拟对要砸的部分进行操作,对该区域减去砸的地方左上角的数(也就是次数),如果小于零就return false。这样会浪费许多时间。我们可以从大到小枚举锤子,并且只有所有地洞地鼠之和%锤子体积为0时才进行操作,另外,只有当地鼠和÷锤子体积小于等于已得到答案的最小值时才砸。#include<cstdio>#include<iostream&g...原创 2018-07-29 07:24:41 · 516 阅读 · 0 评论 -
【题解】codevs P1108 方块游戏
搜索+自行模拟,注意边界情况限制xy的范围#include<cstdio>#include<iostream>#include<algorithm>#include<cstdlib>#include<cstring>using namespace std;int m,n;char color[55][55];bool...原创 2018-07-29 07:26:51 · 207 阅读 · 0 评论