- 博客(38)
- 收藏
- 关注
原创 洛谷P4170 [CQOI2007] 涂色题解
当区间[i,j]的首尾相同时,如样例2的区间[1,5],首尾颜色都是R,我们就可以先全涂成R,再对区间[2,5]进行涂色,我们可以发现,最后的R(或第一个R)并没有消耗涂色次数,所以。当区间[i,j]的首尾不同时,即无法通过覆盖等方式减少涂色次数时,,所以我们并不需要进入循环取枚举分割点来再求一遍。我们不难想到,本题是一道区间dp.为区间[l,r]的最小涂色次数。,这样可以减少一点时间复杂度。本题时间复杂度最大为。
2025-01-26 22:16:13
357
原创 洛谷P1757 通天之分组背包
我们需要再i和j中间加一层循环,来枚举每组取第几个的情况,状态转移方程也需要变化,由于原来的01背包时和现在的答案比较,所以即使我们加了一层循环,它也是和取前面的数的答案和现在的答案进行比较,也有可能去了前面的数。把dp数组增加一维,从 1到组的数量,状态转移方程变成了。取前面的最大值和再上一层取这个数的最大值。
2024-07-30 19:05:23
454
原创 洛谷P1853题解
dp.这道题需要用到三层循环,我们需要一年一年进行dp,每次dp的结果都加到s里,我们每次还需要memset设置dp为零,但是dp数组的内存会很大,会MLE,但是题目中有一句话“且 a 是 1000 的倍数”,所以我们只需要将a除以1000,每次j+=1000,这样和原来就没有任何区别。
2024-07-29 19:37:06
204
原创 洛谷P1833樱花题解
多重背包模板,并且暴力都能过,三层循环,最外层从1到n枚举前i个樱花,第二层从w[i]到t枚举时间,第三层从1到p[i]枚举次数。如果p[i]等于零,我们就直接赋值为100,因为Pi(0≤Pi≤100)。
2024-07-29 19:06:39
293
原创 洛谷P1064金明的预算方案题解
购买附件是一定要购买主件,并且附件最多有两个,所以一个主件搭配附件的方法只有四种(选第一个,选第二个,都选,不选)。所以我们在dp时只考虑主件,枚举这四种方案。输入中的第三列表示的不是第几个主件,而是在第几行的主件。我们可以用一个二维数组,第一维表示几行的主件,第二维表示这个主件的附件在第几行。
2024-07-28 12:57:16
221
原创 洛谷P2392题解
kkksc03有两个半脑,最理想的状态是每个半脑花费的 时间都是总时间的一半,所以我们用时间的一半作为背包容量来dp每半脑,但是这个半脑消耗的时间不会超过另一半,所以这一科的答案为时间总和减去这个半脑的答案。dp[i]表示花i个时间的最优解,一科的时间最大为20*60=1200,一半是600,所以至少要开601.
2024-07-26 20:22:04
222
原创 洛谷P1164题解
dp.状态转移方程和别的题目不一样,我们需要求宣和不选这道菜的方案总数,不选的方案总数为dp[j],选的方案总数为dp[j-v[i]],所以dp[j]=dp[j]+dp[j-v[i]].这道题也要初始化dp[0]=1;
2024-07-25 21:00:47
214
原创 洛谷P1910题解
一个变型的DP这道题增加了一个维度,其他地方和其他的01背包没有任何区别只是状态转移方程由变成了还要注意一点,不能开三维的数组,会MLE。
2024-07-25 20:21:47
157
原创 洛谷P1802 5 倍经验日题解
输出5倍的dp[x],这可能会爆int,所以要开long long.因为我们需要考虑j<u[i]的情况,所以我们能蹭循环要遍历到0.dp[i]表示打i罐药的最优解。一道变形的01背包。
2024-07-25 19:23:02
272
原创 洛谷P2925题解
花0块钱的答案是0,所以dp[0]=0,所以不需要初始化。但是本题的w和v是一个数组,所以本题的状态转移方程为。dp[i]]表示花i元钱可以获得的干草垛最大值。最终的答案应该为花c元的,所以输出 dp[c]普通的01背包状态转移方程为。
2024-07-25 17:11:21
193
2
原创 洛谷P1002(过河卒)题解
由于不能走到马和马的控制点,所以我们用一个数组标记马和马的控制点,到那个点的时候直接continue掉。另外要注意一下,这道题的起点时0,算马的坐标时会RE,所以我们把所有的坐标加二,遍历时从2开始。由于卒只可以从左边和上面走,所以走到(i,j)的路程总数为从上面走的路程总数加上从左边走的路程总数。直接爆搜会TLE,所以考虑进行DP。
2024-07-23 21:34:02
519
原创 noi2.6 8462大盗阿福题解
由于不能连续扒两家店,所以我们有两种选择:1.获得前i-2个的最大值和第i个店的钱。2.获得前i-1个的最大值。在这两个答案中去最大值即可。第一个的最大值肯定是第一个本身,所以。
2024-07-22 20:46:59
323
原创 洛谷P9050题解
我们可以遍历一遍数组,如果这条鱼就是当前考虑的鱼,那么就跳过(可以用结构体,存储每一条鱼的编号),如果这条鱼比当前的鱼轻,那么就sum(表示当前鱼的重量)加上这条鱼的重量,否则就return false;如果运行到了最后,就return true;但是我们把每条鱼都考虑一遍,时间复杂度为,会。
2024-03-27 19:30:22
373
原创 洛谷P1683题解
一道很简单的搜索题,先遍历一遍数组,找到起点,再用DFS或BFS找到所有从起点能到达的点,每遍历一个ans++,需要注意一点,所以DFS不能回溯,否则会重复记录。
2024-03-23 13:07:46
468
原创 洛谷P2386题解
既然有空盘子,我们就需要将下次递归的盘子数减一,这样一直递归下去,无论少几个盘子都可以被递归到(每次减一,多减几遍就可以考虑到其他的数)。有250个苹果和114514个盘子,这样总会有最多114264个盘子不装苹果,所以这些盘子是。为苹果数是apple个时,盘子数是plate个时的答案。要想全部放满,就要用plate个苹果先放满盘子。先看这道题的数据:1≤m,n≤10,,很显然,他们的答案都是1。2.盘子数不比苹果数多。1.盘子数比苹果数多。
2024-03-10 12:58:49
451
原创 CF68B题解
我们可以定义一个变量,如果一个数大于目标的电量,那么这个变量就加上多出来的电量,减去损失的电量,表示可以传输这么多的电量,如果一个数小于目标的电量,那么就减去比目标电量少的电量,表示消耗了这些电量。最后如果这个变量为负数,就表示需要消耗的比多余的要多,是不可以的,就return false;如果大于等于零,就表示正好或者有多余的电量(多余的电量可以传来传去传没),是可以的,就return true;因为每传一次都会损失一些电量,所以我们只需要多传几次,每个的电量就剩下小于。,总的时间复杂度至少是。
2024-03-05 20:12:58
550
原创 P1031题解
我们要先算出平均值。1.这个数大于平均值:把这个数比平均值大的移到下一个数(因为前面的已经排好了)。2.这个数小于平均值:把这个数比平均值小的移到下一个数(因为前面的已经排好了)。
2024-03-03 20:47:37
237
原创 洛谷P2440、P8800、P1577三道二分基础题题解
小数二分不好做,先乘100变成正数进行二分,最后输出时再转成小数,其他思路基本和P2440相同。二分最大能切成多长,check(x)来求切成长度为x的时候能切成几段,并与k比较。小数二分不好加一减一,所以直接等于mid,l和r的距离小于一个极小值即可。二分最多等弄几副牌,check(x)来求要弄x张牌需要写几个,再与。
2024-03-02 14:32:09
344
1
原创 CF1731D题解
我们定义了数组 b和z,我们可以用b来表示某个数是否大于等于l,如果是,那么b[i][j]就为0,否则为1。我们用ans表示答案,初始值为一个极大值,每次和一个区间的z取min,最后看看是不是0就可以了。一共有t组数据,每组数据都有一个n和m,表示长和宽,再输入一个二维矩阵,之后,你需要选取一个边长为l的正方形,使这里面所有数都大于等于l,求l的最大值。3.在C++的高版本中,我们可以定义a[n][m],每次用的时候清空,本蒟蒻用的就是这种。如果我们一个一个找l肯定会超时,所以我们要使用二分。
2024-02-27 20:47:32
381
原创 洛谷P5250题解
我们从这句话:“如果已经有相同长度的木材那么输出Already Exist。”可以看出,本题是需要去重的,从“如果没有刚好长度的木材,取出仓库中存在的和要求长度最接近的木材。”可以看出,本题是需要排序的,那么既去重又排序的数据结构就是set了。
2024-02-25 20:32:43
318
原创 CF1117C Magic Ship 题解
这道题是一道经典的二分题,我们需要二分需要的天数,这道题是天数越少越不能成功,天数越多越能成功。最后要特判永远无法到达的情况。
2024-02-24 16:33:56
324
原创 洛谷P1009题解
虽然50看上去不是很大,但是它的阶乘之和却达到了31035053229546199656252032972759319953190362094566672920420940313(三百一十万零三千五百零五亿三千二百二十九万五千四百六十一亿九千九百六十五万六千二百五十二亿零三百二十九万七千二百七十五亿九千三百一十九万九千五百三十一亿九千零三十六万二千零九十四亿五千六百六十六万七千二百九十二亿零四百二十万零九千四百零三*一百+十三)所以——一定要用高精!
2024-02-17 18:13:06
358
原创 洛谷P1996题解
用队列,用一个变量kill表示报到几,如果报到m就出队,如果没有报到m就把这个数放到最后,每次kill++。n个人围成一圈,编号分别为1到n,从第一个人开始报数,报到m的人就。,下一个人继续从一开始报数。一直重复,知道所有人都。
2024-02-08 19:32:27
353
原创 洛谷P1206
由于本题中有十一到二十进制的数,所以判断回文时不能用int类型的数组,而要用string。由于在非十进制数上进行乘方比较困难,所以我们要先转化,再乘方,最后判断回文。直接转化即可,注意特判十到十九的情况。
2024-02-07 16:35:29
303
原创 洛谷P3864题解
由于将编号翻译成字符串可能会超时,所以我们选择将字符串翻译成编号(需要特判“Q”和“Z”),这道题不用任何算法,直接模拟即可。现在有4617个字符串,问其中有没有一个编号n可以翻译成的,如果有,则输出这个字符串,如果没有,则输出“NONE”。很显然,4734只能翻译成GREG,所以输出GREG。这道题翻译的像···
2024-02-07 12:44:34
266
原创 洛谷P7935(修正版)
将第一、第二、第三行的序列分别用 a , b , c 表示,由于 a 序列中包含从1到 n 的所有数,而 b 序列和 c 都只包含从1到 n 的一些数,所以如果 a 序列中有一个数 x ,而 b 序列或 c 序列不包含 x ,那么就要将 x 这一列删掉。但是后面的操作可能会影响 x 在 b 序列和 c 序列中的存在,所以需要重复几次上面的代码,,重复3次就可以 AC(如果在比赛中遇到这种题,最好重复>=100次)。
2024-02-07 12:22:25
387
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人