自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(51)
  • 收藏
  • 关注

原创 LightOJ 1150 Ghosts! 二分图 BFS 枚举

题意:给一个矩阵,"."代表空地,“#”代表迷雾,“G”代表鬼,“H”代表人,每个鬼要吓唬一个人,然后回到自己的位置,每走一格消耗一分钟,吓唬人消耗两分钟,每个鬼只能吓唬一个人,求需要消耗的最小时间。思路:用BFS求出所有鬼和人之间的边,按照长短排序,每次放入一条边然后求最大匹配,如果最大匹配与人的数量相同则成功,输出当前边的长度。#include <iostream>#incl...

2019-11-07 16:22:20 106

原创 HDU 1151 Air Raid

题意:一座城市有一些路口,两个路口用一条道路连接(道路是单向的),现在我们要在一些路口空降伞兵,每个伞兵都可以沿着道路走并占领路口,但不能有两个伞兵占领同一个路口的现象,请问最少需要多少伞兵。分析:把路口当作点,求出最小覆盖不重合路径数即可。#include <iostream>#include <stdio.h>#include <stdlib.h>...

2019-10-05 10:35:33 91

原创 Codeforces Kitchen Plates

题意:有5个未知量,给五个不等式,要求你按照大小给出一个排序,如果自相矛盾的话就输出impossible。分析:拓扑排序即可,如果成环的话,输出队列里的元素个数会小于五。暴力便利所有排列然后根据给的条件判断是否成立也可以。拓扑排序代码#include <iostream>#include <stdio.h>#include <stdlib.h>#i...

2019-10-03 16:15:14 187

原创 POJ 3020 Antenna Placement

题意:给出一个h*w的矩阵,*代表城市,一个基站可以覆盖两个相邻的城市,问至少要建立多少个基站才能覆盖所有城市。思路:把所有城市当作节点建立一个二分图,相邻的城市之间连一条边,先求一个最大匹配,目前要建立的基站数是匹配数/2(对称)。然后对于每一个没有被包含在最大匹配之中的城市,需要建立的基站数就+1.(因为只能为他们单独建立一个)。#include <iostream>#inc...

2019-09-05 19:46:45 85

原创 HDU 4185 Oil Skimming 二分图

题意:给定一个nn的矩阵,“.”表示水,“#”表示油,现在要用一个12的勺子取油,问最多能取多少次。思路:把所有油当作左右两个节点,相邻的话就连一条边,然后求最大匹配。如何证明最后的结果一定是对称的:对于一个对称的匹配方案,如果左边的部分存在增广路,右边的部分一定也存在增广路,所以结果一定对称。#include <iostream>#include <stdio.h&gt...

2019-09-05 19:07:10 80

原创 HDU 2819 Swap 二分图

题意:给一个n*n的矩阵,非零即一,问你可不可以通过交换行或者交换列,使从左上到右下的斜对角上都是1,如果可以的话,输出交换方案。分析;如果一行或者一列上没有1的话,那么无论如何交换都不会满足条件,所以我们只需要建立一个二分图,左边是行,右边是列,根据1的位置连边,跑一遍最大匹配,然后找出每一行每一列对应的1的位置(在match数组里),然后开始交换即可。#include <iostre...

2019-09-02 19:56:29 90

原创 HDU 1045 Fire Net

题意:给一个最大4*4的网格,每个格子是空地或者墙,需要你在空地上安放炮楼,炮楼的攻击范围是直线,要求炮楼不能互相攻击,问最多放多少个炮楼。如果一行被一堵墙分成两份,那我们就把这一行当作两个小行,同理,如果一列被墙分成了两份,我们就把这一列拆成两个小列。建立二分图,左边是小行,右边是小列,有公共点的话就连一条边,然后求最大匹配即可。#include <iostream>#incl...

2019-08-30 20:41:48 89

原创 FZU 2150 Fire Game

比较简单的一道BFS。题意:给一个nXm的矩阵,“.”代表空地,“#”代表草地,让你选择两个(或以下)草地点火,每过一秒火会向草地相邻的菜地蔓延,问你至少需要多长时间可以蔓延到所有草地。n和m都非常小,直接枚举两个起始点即可,然后bfs,把接下来要烧的草地放到队列里,队列空了之后判断是否烧干净即可。#include <iostream>#include <stdio.h&...

2019-08-29 20:49:44 145

原创 POJ 1426 Find The Multiple bfs

题意:输入一个数字n,找出一个十进制数找包括0或1,使这个十进制数是n的倍数。思路:bfs,比方说对于6这个数字,如果i%6 == j%6,那么我们只要保存i,j中的一个就可以了,反正加一个“0”或者“1”之后再对6取模的结果是一样的,用这种方式来剪枝。#include <iostream>#include <stdio.h>#include <stdlib....

2019-08-27 20:51:42 90

原创 POJ 1015 Jury Compromise

题意:从n个陪审员中选出m个,每个陪审员有控诉和辩护两个属性,要求两个属性和的差值最小,在这种情况下,总值最大(为了保证法庭的精彩??)。dp[i][j]表示选到第i个陪审员的时候,差值为[j]时,最大的总值。用path[i][j]记录选择了哪个。注意pos与i的关系。#include <iostream>#include <stdio.h>#include &l...

2019-08-26 20:15:36 112

原创 POJ 3186 Treats for the Cows 区间dp

题目中要求我们从中间往两边选,我们可以换一种思考方式,改为从中间往两边选,比如第a次我们选择了第b个,那我们的收入就增加了(n - len) * value[b],len为已经选取的区间长度。我们用dp[i][j]表示选取i~j区间获得的最大价值,它可以由dp[i+1][j]或者dp[i][j-1]转化而来(就是最后一个选i还是选j),转移方程如下dp[i][j] = max(dp[i+1][...

2019-08-22 19:13:28 88

原创 POJ 3666 DP

首先,这道题的数据特别水,我们主要写验证他不严格升序的代码即可。通过分析我们能够发现,影响前i个数所用的总消耗只收前i-1个数的总消耗与第i-1个数的高度相关,所以我们可以用二维数组dp[i][j]表示使得前i个数不严格递增,并且最大高度为j所用的花费。再分析,在计算dp[i][j]的时候,第i个数字的大小一定是j,所以我们只需要在dp[i-1][0]到dp[i-1][j]中取最小的一个即可,...

2019-08-20 20:09:26 114

原创 HDU 1074 状态压缩dp

把所有作业做与没做的状态压缩为1与0,这样我们就可以用一个小于2n的数字来表示任意作业做与没做的状态。很显然,所有作业全做完了的状态一定是由某一科没做完演变而来,即111肯定是由011,101,110三个状态之一演变而来,我们只需要找出这三种状态,逐个比较得出减分最少的一个路径即可。#include <iostream>#include <stdio.h>#inclu...

2019-08-19 21:13:20 73

原创 LightOJ 1341 唯一分解定理

思路就是把a分解质因数,对于一个质因数a1p1,会是a的因数多(p1+1)倍(不选或者选几个,乘法法则),对于每个因数,都会有另一个因数与他乘在一起结果是a,所以我们求出因数的个数之后除以2即可得出组合的数量,然后对于给的范围,0~b中每有一个因数,组合的数量便会减一。如果我们需要对N分解质因数,只要把质数表打到N1/2即可,因为不可能有两个质因数都大于N1/2。#include <io...

2019-08-13 19:51:16 118

原创 LightOJ 1370 欧拉函数

先打表。一开始我打算对于每个学生的数字直接从1开始找,后来发现这样会t。注意到欧拉函数有一个性质,就是大的结果第一次出现一定会比小的结果第一次出现晚,所以我们可以先把学生的幸运数字从大到小排序,如果第二个学生的幸运数字在phi[5]取到,那么第三个学生的幸运数字绝对不会在第五个之前,按照这个方式把复杂度优化到nlogn。#include <iostream>#include &...

2019-08-13 14:25:47 80

原创 HihoCoder 1722 尺取法

对于每个数字,记录他的值以及他所在的行数,然后把所有数字从小到大排序,建立左指针和右指针,只要左右指针之间包含的数没有遍布所有行(用cnt计数,vis数组记录每行出现的次数),就将右指针右移。遍布所有行之后,左指针右移知道左指针对应的数字所在的行只出现了一次(如果再右移就不满足遍布所有行的要求了),刷新答案。#include <iostream>#include <algor...

2019-08-11 12:06:51 297

原创 UVALive 8275 网络流

把给定的每种相同的时间段成一个点,再把每一天抽象成一个点,每一天都与汇点连一条容量为0的边(以后需要扩张,所以一开始设为0)。然后对于每个时间段,都对他对应的天连一条容量为INF的边。然后这里需要用到一个mp数组,用来存储时间段对应的边的序号,mp[x][y]即为源点到 " 范围为x~y的区间代表的点 "的边的序号。对于每个人建立区间的时候,先看他对应的区间有没有被建立,如果没有的话...

2019-08-10 16:22:33 116

原创 HihoCoder 1754数位dp

把c转化成二进制数,然后数位dp即可。#include <iostream>#include <algorithm>#include <string>#include <stdio.h>#include <cstdlib>#include <math.h>#include <cstring>#inc...

2019-08-10 13:17:38 95

原创 UVALive 8273 DFS

按照点从0到n-1dfs即可。一开始我在想能不能按照连接的顺序来dfs,后来看了别人的答案发现这样复杂而且没有必要。#include <iostream>#include <math.h>#include <iomanip>#include <string>#include <cstdio>#include <stdi...

2019-08-09 10:33:02 102

原创 HDU 6336 找规律 容斥

通过观察可以发现,假设给的数组长度为l,如果l为奇数,那么ll的矩阵周期性出现,如果l为偶数,那么2l2l的方阵周期性出现,所以我们可以把2l * 2l的方阵存起来,然后写一个函数f,这个函数接受一个点,返回这个点与0,0点所代表的方阵中所有子元素的和,接下来只要运用容斥关系,把四个点扔进这个函数求值即可。#include <iostream>#include <math.h...

2019-08-08 19:29:48 183

原创 HDU 6341 DFS搜索

思路比较简单,就是对于十六个区域逐个搜索它旋转了多少次,因为只有16个大格所以复杂度不会太大。#include <iostream>#include <math.h>#include <iomanip>#include <string>#include <cstdio>#include <stdio.h>#inc...

2019-08-08 14:12:41 76

原创 HihoCoder 1469 dp

一道不太明显的dp,dp[i][j]的含义是,以i,j为右下角的福字的大小。首先进行预处理,两个二维数组。shang[i][j]表示从坐标ij的元素开始向上寻找,能找到多少个元素使他们都满足map[i-1][j] + 1 == map[i][j],比如这个1 2 32 3 43 5 5他的shang数组就是1 1 12 2 23 3 3同理,再构建一个左数组。然后我们就可以...

2019-08-07 20:52:34 137

原创 CodeForces 1114C 数论

求一个数a的阶乘中有多少个因数b就用a/b + a/b2 + a/b3 …直到除不动了为止。对于这道题收到的n和b,首先把b分解质因数,把因数和个数存在数组里,然后对于每个因数都去算a的阶乘里有多少个那个因数,然后除以它在b中的次数,求它可以够组成多少个b,对于每个因数都这么算,然后取最小值。#include <iostream>#include <math.h>#...

2019-08-07 20:26:08 137

原创 Codeforces 1000D dp

注意对题意的理解,对于给出的序列,我们需要找出他满足要求的子序列,然后对于每个子序列,再把它分成几个满足要求的子串 。对于任意一个元素i,我们需要至少往后面走a[i]位,然后从i+a[i]+1开始直到结尾,以这些开头的子序列都可以和i开头的子序列连在一起,对于一个j,以i开头,长度为a[i]+1的子序列可以选出C[j-i-1][a[i]]种,所以要用组合数乘上dp[j],再把对于每个j的值加到一...

2019-08-06 15:50:07 151

原创 HihoCoder 1839 数学

这题本质上是个暴力。首先把输入数字的所有位数加在一起,我们把它称为total,要求的就是total*(1111…111)(n位)的最小质因数。如果直接暴力求值的话单是对于一个质数求total*(1111…111)%Mod就要n的复杂度,非常不划算,所以我们需要把问题转化一下。通过观察,可以得到这个结论如果total*(1111...111)(n个1)%Mod == 0; 那么(total *...

2019-08-06 14:13:36 87

原创 HihoCoder 1838 贪心

首先把2n+1张牌按照a的值升序排序,然后从头开始,每两张牌为一组,选出那组里b最大的那张,然后再选出最后落单的那张。首先这么选b一定满足条件,接下来只要证明a是最大的即可。因为a是升序排序的,所以即使我们每次都选了两者中a较小的那个,我们只要把序列倒过来看,即原来是1和2,3和4…2n-1和2n,2n+1落单,现在是2n+1和2n,2n-1和2n-2…最后1落单,这么看来,每组我们选的都是a...

2019-08-06 12:38:55 80

原创 CodeForces 1139E 二分图

把潜能当作左边的点,俱乐部当作右边的点,建立二分图,匹配的时候从潜能0开始,一旦匹配失败就跳出。因为二分图无法删边,所以我们可以反过来,先把不会删掉的边放进去,然后把会删掉的边一条一条放进去,每放进去一条就从上次算到的最大匹配开始计算能不能找到更大的匹配,然后入栈,最后把栈里的元素输出即可。用邻接表储存,不然会超时。每次查找都要把used置零,我在这里卡了好久。#include <i...

2019-08-06 10:29:49 140

原创 CodeForces 1174D

我们拿到一个数组a,要求数组a的任意一个区间的所有数字的异或和不能为0或x。首先,如果对于数组a,我们有他的前缀疑惑合数组b,那么数组a的任何一个区间的所有元素的异或和都可以用b中两个元素的异或和表示,那么我们就将问题转化为,最多可以有多少个数字两两异或不为0或x。对于这个问题,我们只需要从1到2n遍历,如果i没有被选取过,那就就选取他,顺便禁用i^x.还有一个要注意的细节就是元素的个数可能为...

2019-08-05 19:57:10 157

原创 Hihocoder 1969 等差数列

复杂度我也不知道怎么证明,但是n3肯定是不行的,优化的方法就是建一个数组,如果一个数字存在就记录他的数量,不然就是0,寻找最大等差数列的时候n2确定首位的两个数,剩下的根据头两个数的间距去查找,应该会比n3好一点。#include <iostream>#include <math.h>#include <iomanip>#include <stri...

2019-08-05 10:36:38 136

原创 LOJ 6008 网络流

一开始我在思考为什么不能直接从一天的开始连一条边到一天的结束,而要分别从源点和汇点连,后来我发现如果这样连的话,如果有一条被送去干洗的餐巾一定会导致总流量的减少,但是我们求的是最大流情况下的最小费用,所以要分别从源点与汇点连接。详细的解释#include <iostream>#include <math.h>#include <iomanip>#inc...

2019-08-05 10:12:52 109

原创 Hihocoder 1755

题比较简单,注意一下111222333444这种情况,就是说要考虑到选取的几位也相同的情况。#include<iostream>#include<math.h>#include<iomanip>#include <string>#include <cstdio>#include<stdio.h>#include ...

2019-08-03 20:25:29 75

原创 POJ 3680 最小(大?)费用流

给的点数值比较大,不好直接建网络流,应该先离散化。离散化之后,对于每个可以选的区间,我们都从左端点到右端点连一条容量为1(因为一个区间只能选一次),权值为-w(只要选择了这条边就能获得-w的权值,便于日后取最大)的边,然后对于1到m-1的每个点,都跟他后面的点连一条容量为k(最多可能叠加k层),权值为0(走这些边就说明什么都没选,也就没有权值)的边,然后从源点s到1连一条容量为k(还是限制叠加次...

2019-08-03 19:19:37 54

原创 POJ 2135 最小费用流

可以把每个点都当作一个节点,去一次再回来一次可以等价为从完全不同(没有共用边)的两条路径上走过去,所以如果两点之间有一条路的话,我们就为他添加两条边,一条正向一条反向(因为是无向图,即使只考虑去的情况也要加两条边,保证正反都可以走,但是事实上只会走一条边),容量设为1(只能走一遍),权值设为路的长度,然后从起点s到点1连一条边,容量为2,再从n节点到终点t连一条边,容量也为2,然后求最小费用流。...

2019-08-03 16:21:26 76

原创 Hihocoder 1878 寻找回文数

一开始打算写大数加法,后来发现想多了,找规律就可以了对于某数字n,位数小于等于n的回文数大概有这么多[0]:0[1]:10[2]:19[3]:109[4]:199[5]:1099[6]:1999[7]:10999[8]:19999[9]:109999经过观察与尝试,我们可以得出一下规律,如果k以大于等于20的数开头,我们只需把第一个数字减一,然后以这个数的最后一位为中心...

2019-08-03 12:36:12 109

原创 C++高精度整数处理板子

支持加减,日后会完善struct BigInteger{ static const int Base = 10; static const int WIDTH = 1; vector<int>s; BigInteger (ll num = 0){ *this = num; } BigInteger operator = ...

2019-08-02 21:20:52 296

原创 POJ 3469 最小割

每个module都是一个节点,都有两条边,一条从s练到该节点,一条从该节点连到t,边的容量即为放在对应core上的代价。如果我们把这个module放在coreA上,就等价于隔断s到该节点的那条边,反之,如果放在coreB上,就等价于割掉该节点到t的那条边,如果两个module需要连载一起,不然要付出额外代价的话,我们就可以在这两个module之间也连一条边,如果他们两个一个与s相连,一个与t相连的...

2019-08-02 10:17:10 103

原创 POJ 1149 最大流

我们可以把每位客人当作节点建立网络流,猪圈中猪的数量便是对流量的限制。首先,如果一个客人第一次打开a猪圈,那我们就在起点s与这位客人之间连一条容量为猪圈a中初始值得边(因为他是第一个开这个猪圈的人,无法调配),对于后来的每个客人,如果他们也想打开猪圈a,就可以从第一位客人这里连一条容量为无穷大的边(因为第一次开猪圈之后就可以调配了),然后求最大流。#include<iostream>...

2019-08-01 21:19:05 79

原创 ZOJ 2760 网络流

首先注意一点,邻接矩阵对角线上的数据(如map[2][2],map[3][3])未必是0,非常坑。首先求出最短路的长度(复杂度n2 或n3都可以),然后对于每条边,假设两个端点分别为a,b,如果起点到a的距离加上ab边长再加上b到终点的距离恰巧等于最短路的长度,则可以判断这条边在最短路上,我们便在网络流中加入这条边。把该加入的边都加入后跑一遍网络流即可。#include<iostream...

2019-08-01 13:39:04 91

原创 POJ 3281 最大流

一道隐含的最大流问题。首先,把每种food当作一个节点,与头部的s节点相连,每种drink当作一个节点,与结尾的t节点相连,这些路径的容量都为1(因为每种food或者drink只能选一次)。然后如果在中间为每头牛建立一个节点,连接它可以用的food以及drink然后直接跑最大流的话,就会有一个问题,比如牛a可以吃foodA与foodB,喝drinkA和drinkB,那么就会有两个流经过这头牛,那...

2019-07-31 20:35:54 82

原创 POJ 1273 最大流

裸题,可以用vector储存邻接表来使代码变得简洁。输入新的一组测试数据的时候要记得清空。下为Dinic算法的代码。#include <iostream>#include <stdio.h>#include <string.h>#include <math.h>#include <algorithm>#include &l...

2019-07-31 10:03:46 74

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除