- 博客(42)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 并查集板子
#include<bits/stdc++.h>using namespace std;int p[10005],n,m,t;int find(int x){ if(p[x]==x) return x; return p[x]=find(p[x]);}bool pd(int x,int y){ int fx=find(x),fy=find(y); if(fx==fy) return true; else return false;}void join(int x,int
2021-12-18 15:57:20
104
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 求连通分量的7个板子
题目前置芝士:连通分量指最大联通子图的节点数解题思路·其一(bfs+邻接表)#include<queue>#include<vector>#include<iostream>#include<cstdio>#include<cstring>#include<cmath>using namespace std;struct ap{ int y,next;}e[10005];int n,ans,head[10
2021-12-17 21:48:55
216
原创 洛谷P1828 [USACO3.2] 香甜的黄油 Sweet Butter
题目大意题目链接ppp个牧场之间有ccc条路,有nnn只在不同牧场的奶牛(可能有多头奶牛在同一个牧场)要到一个牧场去,找到一个牧场使所有奶牛需要走的距离最短。输入第一行为三个整数n、p、cn、p、cn、p、c。第222~n+1n+1n+1行为奶牛所在的牧场。第n+2n+2n+2~n+c+1n+c+1n+c+1行,每行3个整数a、b、da、b、da、b、d,表示aaa牧场到bbb牧场之间有一条长度为ddd的双向道路。解题思路如图B、C、DB、C、DB、C、D牧场各有一头奶牛,最优的方案是选择
2022-01-14 14:26:37
240
原创 P1522 [USACO2.4]牛的旅行 Cow Tours
题目大意链接给出nnn个牧区的坐标,某些牧区之间有路相连,一片连通的牧区被称为牧场(题目会给出至少2个牧场)。现在要修一条路,连接两个不同的牧场。找出这条路,使连接的新牧场的直径最小。(一个牧场的直径就是牧场中最远的两个牧区的最短距离)。解题思路这题先用Floyed求出连通两点的最短路,再对所有牧场进行染色,最后在连接时枚举在不同牧场的两个牧区,将它们相连,此时会出现两种可能:1.新牧场的最大距离在原本的两个牧场内;2.新牧区的最大距离是连接的两个牧区与其最远牧区路径之和加上路的距离。因此,我们还需
2022-01-12 14:19:56
364
原创 最小生成树
题目大意链接普通的最小生成树,给出nnn个农场,求最短需要多长的光纤才能连接所有的农场。解题思路既然是最普通的最小生成树,那么就需要了解两种算法。prim算法prim算法采用的是蓝白点思想,把已进入最小生成树的点标为白点,未进入的标为蓝点,具体如下的例子。如图,初始时所有点都未加入最小生成树,min1=0,min[2,3,4,5]=∞。minmin_1=0,min[2,3,4,5]=∞。minmin1=0,min[2,3,4,5]=∞。min表示每个店离白点的最短距离,设初始点1为白点。
2021-12-25 11:42:06
336
原创 luogu P2502 [HAOI2006]旅行
题目大意题目链接有nnn个点mmm条路,第aia_iai路行驶速度必须为wiw_iwi,现要从点sss去点ttt,求最快速度和最慢速度的比最小为多少(必要时化成最简分数)。如果无法从点sss到点ttt,输出IMPOSSIBLE。解题思路看到用路线联通两个点,就想到了可以用并查集做。因为要求最小的比为多少,所以我们肯定希望最大速度和最小速度接近,因此我们可以先按速度排一遍序。我们排好序后,最快速度肯定出现在最慢速度的后面,因此我们只需要从第111条路枚举到第mmm条路,再从当前枚举的路线iii向后
2021-12-18 16:50:28
99
原创 51nod 1416两点
题目描述给你一个n∗m(1≤n,m≤50)n*m(1\le n,m\le50)n∗m(1≤n,m≤50)的矩阵,用不同的大写字母来表示不同的颜色,找出一个只包含一种颜色的环。例如这张图片中的4个蓝点就构成了一个环。解题思路dfs思路对于这种要往四周找的题,我们可以用dfs做,从某个点开始向四周dfs,不能后退,如果能够再次顺着相同颜色回到这个点,那么就表示有能走回来的路,也就是有一个环。dfs代码#include<bits/stdc++.h>using namespace st
2021-12-18 15:36:59
74
原创 同余剪枝 01组成的n的倍数
题目大意给出一个自然数N(≤1000000)N(\le1000000)N(≤1000000),找出MMM,使MMM是NNN的倍数,并且MMM的十进制中只包含000和111。求出最小的MMM。解题思路由于NNN可能等于100000010000001000000,所以暴力是不可能了,我们要考虑找另外的做法。我们发现,对于MMM,它只包含000和111,所以我们可以使用广搜的方法,对于一个形式合法但不是NNN的倍数的数,我们可以在它的后面加上000或者111,(即乘101010或乘10+110+110+1)
2021-12-11 17:04:51
896
原创 动态规划 luogu P1854 花店橱窗布置
题目大意P1854给你nnn束花和mmm个花瓶,第iii束花放在第jjj个花瓶中可以取得ai,ja_{i,j}ai,j的好看值,并且第iii束花必须放在第i+1i+1i+1束花左边。每个花瓶仅能放一束花,花瓶的数量可能大于花的数量,求出最大可以获得多少好看值以及第iii朵花应该放到哪一个花瓶中。题目描述首先我们来处理最大好看值。当看到第iii束花必须放在第i+1i+1i+1束花左边时,就应该想到dp的无后效性。定义dp数组fff,fi,jf_{i,j}fi,j表示前iii束花放在前jjj个花瓶时
2021-12-10 21:54:28
384
原创 luogu P1435[IOI2000] 回文字串 / [蓝桥杯 2016 省] 密码脱落
题目大意P1435给出一个字符串sss,求出最少还需加上多少个字符才能得到一个回文串。解题思路回文串的特点是从左看和从右看都会看到同一个字符串,所以当把这个串从左和从右分为s1s1s1和s2s2s2两个字符串时,它们一定是相同的。因此,s1s1s1和s2s2s2的最长公共子序列是它们本身。知道了这个特性后,我们只需要求出sss和sss的倒序的最长公共子序列的长度,得到sss与sss倒序的共同字符个数,再用sss的长度减去它,就能得到最少需要加上的字符个数。代码#include<iostre
2021-12-09 16:53:50
261
原创 ssl1653数字游戏
题目大意给出nnn个数a1,a2,...,ana_1,a_2,...,a_na1,a2,...,an和nnn个数b1,b2,...bnb_1,b_2,...b_nb1,b2,...bn,有mmm个回合,每个回合可以选取一个数aia_iai,但是其他的aja_jaj就会减去一个bjb_jbj,求可以选得的数的总和最大为多少。解题思路通过题目,我们不难看出,对于两个数aia_iai和aja_jaj,如果我们想取得的和最大,那么我们就得先把bbb值较大的数取了,这样较大的bbb不会减,
2021-12-04 16:34:10
2288
原创 luogu P1026 ssl1017 统计单词个数
题目大意给出一个长度为 20∗p(≤200)20*p(\le 200)20∗p(≤200) 的字符串strstrstr,把它分成kkk段。再给出nnn个单词,求在这些段里最多能包含多少个给出的单词,两个单词可以存在部分重合,但选用之后第一个单词不能使用(例如字符串thisthisthis中可包含thisthisthis和isisis,选用thisthisthis之后就不能包含ththth)。解题思路其实刚看到的这题我想的是枚举,但是一看数据,用枚举肯定会爆,所以要找其他的方法。再看题目,发现对于字符串
2021-12-04 16:01:07
738
原创 ssl1212 大厅安排 luogu P2439 [SDOI2005]阶梯教室设备利用
题目大意原题给出n个时间段(开始时间和结束时间),从中选择几个不重合的时间段,使得所有时间段加起来最大。解题思路由于时间段不能重合,并且输入不是按顺序排的,所以直接做会导致漏掉需要选择的时间段或选择了...
2021-12-04 10:53:24
239
原创 ssl1638 拔河比赛
题目大意给出n(≤100\le100≤100)个人的重量(≤450\le450≤450),把他们分成两组,两组的人数差不超过1,使两个组内所有人体重相加尽可能接近。解题思路单看题面,我们不能发现这题跟dp有什么关系,因为当人数为n−1n-1n−1的方案为最优时,我们不能保证nnn的方案最优,因此不能用dp,但题目中说了每个人的体重不超过450,所以我们可以将体重作为数组下标,用f[i,j,k]f[i,j,k]f[i,j,k]表示当前i个人中选j个人在一组时能否组成差为k的方案。因为f[i,j,k]f[
2021-12-04 08:47:49
211
原创 P1282 多米诺骨牌
题目大意给你几个多米诺骨牌,可以上下翻转,求出最少的翻转次数使得上下相减的绝对值最小。解题思路按照老师的PPT做法,不考虑翻转次数,先考虑绝对值最小,则令fi,jf_{i,j}fi,j为前iii张牌能否造成绝对值为jjj的方案,可得f[i,j]=f[i–1,j–(a[i]–b[i])]orf[i–1,j–(b[i]−a[i])]f[i,j] = f[i–1,j–(a[i]–b[i])] or f[i–1,j–(b[i]-a[i])]f[i,j]=f[i–1,j–(a[i]–b[i])]orf[i–1
2021-12-04 08:07:08
216
原创 ssl1633农田个数
题目大意给你一个由0和1组成的n*m的矩阵,求其中以1组成的正方形个数。其中不同的两个正方形农田至少要包含下面的两个条件中的一条:边长不相等;左上角的方格不是同一方格解题思路如果直接枚举求个数肯定会爆,所以我们要找其他的做法,经过观察和实践,不难发现,对于一个右下角为(i,j)(i,j)(i,j)的非0正方形,它的最大边长为min(fi−1,j,min(fi,j−1,fi−1,j−1))+1min(f_{i-1,j},min(f_{i,_j-1},f_{i-1,j-1}))+1min(fi−1,
2021-12-03 21:19:36
86
原创 P1004方格取数
题目大意给出一个地图,从左上角往右下角走两次,只能往下和右走,每次经过一个有值的点就会取走方格中的数(获得数且使当前方格变为0),求走两次最大的取得数之和。解题思路刚看到这题第一个想到的就是贪心,但是由于要走两次,所以无法保证两次的结果之和为最优,所以不能用贪心。由于只能往右和下走,所以具有无后效性,因此可以用dp,只不过需要同时dp两条路。定义数组fff,fi1,j1,i2,j2f_{i1},_{j1},_{i2},_{j2}fi1,j1,i2,j2表示当第一次走到i1,j1,第二次走到i
2021-12-03 20:32:56
101
原创 取数字问题
题目大意给一个M*N的矩阵,其中每一个元素都是-10~10间的整数,从左上角走到右下角,每一步只能向下或向右,并不能走出矩阵范围,求一条最合适的路,使走过的元素之和是尽可能小的正整数,若没有合法的走法则输出-1。解题思路考虑两种写法,记搜和dp。记搜写法考虑枚举每一个可能走到最后得到且合法的值,也就是1~N*M *10,从中选出能走得出来的最小值,若没有则输出-1,由此定义一个数组f,fi,j,kf_i,_j,_kfi,j,k表示当走到i,ji,ji,j时能否得到kkk。dp写法dp跟记
2021-12-03 19:40:04
100
原创 ssl2291 分组背包
题目大意有一个容量为vvv的背包,给出nnn件共被分为ttt组的物品,第iii件物品的重量和价值分别为w[i]和c[i]w[i]和c[i]w[i]和c[i],组号为ppp,每组最多只能选一件物品,求在可装入范围内的最大价值总和。解题思路对于某组物品,需要考虑是选取1件还是1件都不选,所以f[i][j]f[i][j]f[i][j]就表示当容量为j时前i组物品可以取得的最大价值,所以可得f[i][j]=max(f[i−1][j],f[i−1][j−w[i]]+c[i])f[i][j]=max(f[i-1]
2021-12-03 18:45:48
88
原创 luogu P2822 [NOIP2016 提高组] 组合数问题
目录题目大意解题思路样例输入1输入2输出1输出2代码题目大意洛谷通道解题思路这题一看数据范围就知道不能用普通方法做,所以我想到了杨辉三角,杨辉三角中a[i][j]=Cj−1i−1a[i][j]=C^{i-1}_{j-1}a[i][j]=Cj−1i−1,并且如果边做边模就不会爆int,于是我愉快地交了一个杨辉三角,结果……愉快地爆了可见普通的杨辉三角加一次遍历是绝对会爆的,所以我又想到了答案前缀和,在计算当前这个数的时候就把前i,ji,ji,j个数中符合答案的数的数量用前缀和记起来,这样就可以省
2021-11-13 14:04:22
629
原创 P1063 [NOIP2006 提高组] 能量项链
目录题目大意解题思路样例输入输出代码题目大意原题通道解题思路这题用区间dp做,由于项链是环形的,可以先合并第一个和最后一个,所以要先做预处理,把项链复制一遍,使头尾相连。fi,jf_i,_jfi,j表示第iii个珠子到第jjj个珠子合并所得的最大能量。枚举一个kkk,表示先合并前iii到k−1k-1k−1个,再合并后kkk到jjj个。由此可得状态转移方程为:fi,j=max(fi,j,fi,k−1+fk,j+ai∗ak∗aj+1)f_i,_j=max(f_i,_j,f_i,_{k-1}+f
2021-11-13 11:24:16
448
原创 luogu P1111 修复公路
目录题目大意解题思路代码题目大意传送门解题思路这题就是求出所有村庄都连通时,最小的t是多少。一看,并查集加排序,输入两个村庄,再按t排序,遍历一遍,如果没有连通就就把它们俩连起来,并减少未连通的村庄数量,当所有村庄都连通了,就输出t。代码#include<bits/stdc++.h>using namespace std;int p[100010],n,m,ans=-1;struct ap{ int x,y,t;}a[100010];bool cmp(ap x,ap
2021-10-15 19:33:19
93
原创 洛谷P1077 摆花
路标题目描述解题思路代码题目描述题目传送门解题思路这题标签是dp,但实际上可以用搜索做,只需要用记忆化优化一下就行了(具体代码会有注释)代码#include<iostream>#include<cstdio>using namespace std;int a[1001],f[1001][50],n,m;int mod=1000007;int dfs(int x,int k){//x表示当前搜到第几种花,k表示当前拿了多少盆花 if(k>m) retur
2021-09-05 14:19:13
94
原创 洛谷P1049 装箱问题
路标题目描述解题思路代码题目描述解题思路这题是一个简单的dfs(当然你也可以用DP做),对于某个物品只有放和不放两种情况,只需要进行两种情况的深搜代码#include<iostream>#include<cstdio>#include<cmath>using namespace std;int m,n,ans=20001,a[10001];void dfs(int x,int k){ if(k>n)//如果当前物品总共的体积已经超过了箱子的空
2021-08-27 19:16:21
193
原创 洛谷P1616 疯狂的采药
路标题目描述解题思路代码题目描述题目传送门戳我解题思路这题就是一个裸的完全背包,太水了,直接跳过吧。状态转移方程:dp[j]=max(dp[j],dp[j−b[i]]+a[i])dp[j]=max(dp[j],dp[j-b[i]]+a[i])dp[j]=max(dp[j],dp[j−b[i]]+a[i])代码#include<iostream>#include<cstring>#include<cstdio>#include<cmath>
2021-08-21 09:44:54
93
1
原创 洛谷P5761最佳游览
路标题目描述解题思路代码题目描述题目传送门请戳这里解题思路这题其实就是在每一列里找到一个最大的数,随时可以退出,最后输出最大值,我们可以用一个一维数组dpdpdp来保存当前第iii列中的最大得分,将当前的最大得分存在ansansans里,最后输出。状态转移方程:dp[i]=max(dp[i−1]+f[i],f[i])dp[i]=max(dp[i-1]+f[i],f[i])dp[i]=max(dp[i−1]+f[i],f[i])代码#include<iostream>#inclu
2021-08-21 09:30:39
153
3
原创 洛谷P2918 Buying Hay S
路标题目描述解题思路代码题目描述原题传送门请戳这里解题思路这题是一个完全背包,但由于可能会用更少的钱买到比需要更多的干草,所以需要再循环几次,才能找到最小的开销。状态转移方程:f[j]=min(f[j],f[j−a[i]]+b[i])f[j]=min(f[j],f[j-a[i]]+b[i])f[j]=min(f[j],f[j−a[i]]+b[i])代码#include<iostream>#include<cstring>#include<cstdio>
2021-08-21 09:18:40
162
1
原创 SSL2863 合并石子
合并石子题目描述解题思路代码1代码2代码3题目描述注:本题数据较水,2≤N≤1002\le N\le1002≤N≤100解题思路这题一共有三种解法。第一种是先枚举边界,再枚举要合并的堆数,然后求出结果。状态转移方程:dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+f[j]−f[i−1])dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+f[j]-f[i-1])dp[i][j]=min(dp[i][j],dp[i][k]+dp[
2021-08-20 21:53:41
90
7
原创 洛谷P1060 开心的金明
目录题目描述解题思路样例输入输出代码题目描述原题链接金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过NNN元钱就行”。今天一早金明就开始做预算,但是他想买的东西太多了,肯定会超过妈妈限定的NNN元。于是,他把每件物品规定了一个重要度,分为555等:用整数1−51−51−5表示,第555等最重要。他还从因特网上查到了每件物品的价格(都是整数元)。他希望在不超过NNN元(可以等于NN
2021-08-19 16:53:53
119
1
原创 洛谷P1012 拼数
P1012 拼数题目大意解题思路样例1样例2代码题目大意题目链接设有n(1≤n≤20)n(1 \le n\le20)n(1≤n≤20)个正整数a1…an(1≤ai≤109)a_1…a_n(1\le a_i\le 10^9)a1…an(1≤ai≤109),将它们连接成一排,相邻数字首尾相接,组成一个最大的整数。解题思路由于ai≤109,n≤20a_i \le10^9,n \le20ai≤109,n≤20,直接将它们连起来肯定会爆,所以我们可以换一种思路,用字符串做,我们可以用两个循环,每次枚
2021-08-18 21:47:35
73
4
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人