- 博客(77)
- 收藏
- 关注
原创 HDU 3488 Tour 最大完美匹配
有N个城市,M条街道,每条街道是单向的,现在要你设计多条路线覆盖所有的点,每条路线都是一个环,并且每个点仅能被一条路线覆盖且只经过一次因为是圈,所以每个点的入度和出度应该都是1,故将一个点拆成两个点,入度点和出度点,可以想到,网络流的过程就是度数的流,因此可以建图跑最大匹配#include #include #include #include #define rep(i
2016-09-11 23:35:21
273
原创 HDU 2255 奔小康赚大钱 km算法
村里要分房子,有N家老百姓,刚好有N间房子。考虑到每家都要有房住,每家必须分配到一间房子且仅仅能分配到一间房子。另外, 村长为了得到最大利益,让老百姓对房子进行估价因为不同房子的价值是不同的,所以只考虑匹配数是不可以的,要用km算法或者网络流求最大匹配数值#include #include #include #include #define rep(i, j, k)
2016-09-11 23:32:50
394
原创 POJ 2289 Jamie's Contact Groups 二分图多重匹配
给定一个规模为n的名单,要将名单中的人归到m个组中,给出每个人可能的分组号,需要确定一种分配方案,是的最大规模的组最小建图之后,算是一个匈牙利算法的改进,看着kuangbin的模板写的#include#include#include#includeconst int M=2010;int bmap[M][M];bool bmask[M];int nx,ny;int
2016-09-11 23:23:31
553
原创 HDU 3829 Cat VS Dog
有p个小朋友参观动物园,动物园里面有两种动物,分别为猫和狗。规定一个小朋友喜欢猫就讨厌狗,喜欢狗就讨厌猫。现在管理员要移走0一些动物,当然,移走也是有条件的。比如一个小朋友喜欢猫3,讨厌狗4.那么移走狗4,这个小朋友就会非常开心。同样,如果移走猫3,小朋友就会很不高兴。现在问怎么样才能使开心的小朋友的人数最多二分图最大独立集#include #include #incl
2016-09-11 23:16:12
289
原创 HDU 4185 Oil Skimming 匈牙利
用1*2的木板覆盖矩阵中的‘#’,(木板要覆盖的只能是‘#’),问最多能用几个木板覆盖很典型的二分匹配问题,将矩阵中的点分成俩种,下标i+j为奇数和偶数俩种,即把矩阵当成一个黑白棋盘,然后用匈牙利二分匹配#include #include #include #include #include #define rep(i, j, k) for(int i = j
2016-09-11 23:15:00
263
原创 HDU 2819 Swap 最大匹配问题
交换图的某些行或者是某些列(可以都换),使得这个N*N的图对角线上全部都是1.建立二分图,左边表示的是横坐标,右边表示纵坐标,所以范围都是1~N,然后如果a[i][j]是1,那我们就从X的i向Y的j引一条边,然后直接求最大匹配数即可#include #include #include #include #define rep(i, j, k) for(int i
2016-09-11 23:11:16
225
原创 HDU 1281 棋盘游戏 二分图
在一个N*M大小的棋盘中,有K个空位置,(1)在这些空位置上最多能放多少的“车”(一行或一列最多一个)。(2)空位置中,有的位置若不放“车”,就无法保证放尽量多的“车”,这样的格子被称做重要点,求重要点的个数可以看成行与列的二分匹配问题,因为每行每列至多只能放一个棋子#include #include #include #include #define rep(
2016-09-11 23:06:54
253
原创 HDU 4280 Island Transport 网络流
有N个岛屿,M条路线,每条路都连接两个岛屿,并且每条路都有一个最大承载人数,现在想知道从最西边的岛到最东面的岛最多能有多少人过去可以看出是最大流的问题,而且源点汇点也都给出了,可以用dinic解决#include #include #include #include #include #define rep(i, j, k) for(int i = j; i <= k
2016-09-11 21:41:16
222
原创 POJ 1459 Power Network 网络流
给几个发电站,给几个消耗站,再给几个转发点。发电站只发电,消耗站只消耗电,转发点只是转发电,再给各个传送线的传电能力。问你消耗站能获得的最多电是多少很明显电能跟流是类似的,点能从中转站流走可以看出网络流的影子所以就增加一个超级源点,和超级汇点再把所给的发电站都和超级源点相连,把所给的消耗战都和超级汇点相连最后求最大流即可#include #include #incl
2016-09-11 21:36:28
220
原创 POJ 3080 Blue Jeans
求n个长度为60的字符串的最长连续公共子串直接暴力枚举第一个串的每个子串,然后判断是否是后面串的子串即可kmp的简单应用#include #include #include #include #define rep(i, j, k) for(int i = j; i <= k; i++)using namespace std;int nex[100];
2016-09-11 21:04:32
255
原创 POJ 2752 Seek the Name, Seek the Fame
给定一个字符串s,从小到大输出s中既是前缀又是后缀的子串的长度从最后一位开始回溯,若s[next[n-1]] == s[n-1],则子串s[0,1,2,...,next[n-1]]是满足条件的子串。然后判断s[next[next[n-1]]] == s[n-1]是否成立,这样一直回滚,直到next[next[.....next[n-1]]] == -1停止,就可以算出所有符合条件的解
2016-09-11 21:01:33
190
原创 POJ 2406 Power Strings
给定一个字符串,让你求出他最多由几个相同的连续子串连接而成还是用n - next[n]求出循环节,但是有个比较坑的地方就是一定要判断循环节的长度能否整除总长度#include #include #include #include #define rep(i, j, k) for(int i = j; i <= k; i++)#define maxn 1000009
2016-09-11 20:48:28
279
原创 HUST 1010 The Minimum Length
有一个字符串s,一次次的重写s,会得到一个新的字符串sssss.....,现在将这个字符串从中切去一部分得到一个字符串t直接用n - next[n] 求循环节即可#include #include #include #include #define rep(i, j, k) for(int i = j; i <= k; i++)#define maxn 1000009
2016-09-11 20:36:18
307
原创 HDU 1358 Period kmp
一个字符串,从头到某个位置,字符串的前缀最多重复了多少次用next数组做,对于每个位置用i - next[i]求出当前可能的循环长度,然后看能否整除即可#include #include #include #include #define rep(i, j, k) for(int i = j; i <= k; i++)#define maxn 1000009using
2016-09-10 23:27:22
302
原创 hdu 3746 Cyclic Nacklace kmp
给一个字符串,问在首位最少添加多少个字符能使得原字符串循环需要理解next数组,画个图理解就好,用n - next[n]求出循环节然后输出len % p#include #include #include #include #define rep(i, j, k) for(int i = j; i <= k; i++)#define maxn 100009using
2016-09-09 15:41:51
247
原创 hdu2087 剪花布条 kmp
给定一段长布条,然后给一个短布条,问从长的上能减下来几段短的布条还是kmp要注意的是,匹配位置是不能重叠的,所以匹配后,指针需要清零#include #include #include #include #include #include #define rep(i, j, k) for(ll i = j; i <= k; i++)#define ll long lo
2016-09-09 15:34:03
279
原创 hdu 1686 Oulipo kmp
给两个字符串,问第一个在第二个出现了多少次kmp#include #include #include #include #include #include #define rep(i, j, k) for(ll i = j; i <= k; i++)#define ll long long#define maxn 1000009#define inf 0x7fff
2016-09-09 15:28:53
320
原创 hdu 1711 Number Sequence kmp模板
给两个序列,问第二个在第一个出现了多少次kmp模板不解释#include #include #include #include #include #include #define rep(i, j, k) for(ll i = j; i <= k; i++)#define ll long long#define maxn 1000009#define inf 0x
2016-09-09 15:27:09
195
原创 codeforces 197D Infinite Maze dfs
有一个无限的迷宫,由无数个n*m的小单元组成,类似于拼图,给定这个小单元,每个位置是空地或者障碍,再给定起点,问能否从起点走到无穷远的位置刚开始的时候没有想清楚,实际上问题的本质在于,如果一个格子能从他相邻的两个不同的格子进入,那么一定可以走到无穷远的位置。想明白这个就挺好写了,先从起点开始dfs,对于每个没有走到的位置标记是从哪个格子走到他的,然后如果从不同的格子走到了一个已经标
2016-09-09 14:17:17
574
原创 codeforces 186D Mushroom Scientists 不等式
http://codeforces.com/blog/entry/4488 还是直接看cf的题解吧am-gm不等式。。又学到了#include #include using namespace std;int main(){ double a,b,c,S; cin>>S; cin>>a>>b>>c; if(a+b+c!=0) printf
2016-09-08 15:53:44
298
原创 codeforces 166D Shoe Store 二分图 匈牙利算法
题意:有n双鞋,给定其分别的售价和尺码,保证所有鞋的尺码是不用的,有m个人来买鞋,给定其脚的大小以及手里的钱,他可以买跟脚号码相等或者大一号的鞋,同时需要保证手里的钱足够,问最多卖出的营业额是多少因为每双鞋的尺码是不一样的,所以每个人最多有两种购买的可能,一边是顾客,一边是鞋,用map建成二分图,然后用匈牙利求解即可但是为了保证营业额最大,首先要将鞋的售价降序排序,这样可以保证最优
2016-09-08 12:53:38
745
原创 codeforces 200D Programming Language 字符串处理
字符串题,基于cpp模板的声明,先声明了n个函数原型,其中T代替任何数据类型,然后给了m种变量的声明,又给了k 个函数的声明,用的是之前那m个变量,问每个函数分别能匹配多少个函数原型先是字符串处理,然后暴力循环,用变量类型替换变量名,直接判断是否匹配然后统计答案即可#include #include #include #include #include #include #
2016-09-07 20:17:22
360
原创 codeforces 190D Non-Secret Cypher 双指针
给定长度为n的数组a,给定k,问有多少个子数组,其中至少包含着有k个相同的数字双指针经典题目,注意先要离散,然后注意m是1的情况#include #include #include #include #include #define rep(i, j, k) for(int i = j; i <= k; i++)#define maxn 1000009#define
2016-09-07 17:39:34
632
原创 codeforces 200C Football Championship
字符串题,基于cpp模板的声明,先声明了n个函数原型,其中T代替任何数据类型,然后给了m种变量的声明,又给了k 个函数的声明,用的是之前那m个变量,问每个函数分别能匹配多少个函数原型先是字符串处理,然后暴力循环,用变量类型替换变量名,直接判断是否匹配然后统计答案即可#include #include #include #include #include #includ
2016-09-07 11:36:28
466
原创 codeforces 199D Jumping on Walls
有左右两堵墙,高度都是n,每米为一个单位,每个单位是障碍后者是空地,你从左面的第一米开始爬,每秒可以上爬一米,或下爬一米,或者跳到对面墙k米之上,如果爬到n米或者更高就算是登顶,问登顶的最短时间。还有一个限制就是,洪水每秒一米往上,不能到洪水之下最好的办法就是bfs,拓展出每秒所能达到的所有位置,因为bfs是按照时间顺序的,所以之前记录下达到每个格子的最短时间,一定是最优解,这题我用d
2016-09-07 11:34:09
305
原创 codeforces 199C About Bacteria
开始时只有1个 细菌,然后之后的每一秒过去,其细菌数都会变为原来的k 倍加上b,就这样持续增长n秒。问如果最开始有 t 个细菌而不是一个,要增长到原来n秒后的水平(大于等于),至少需要多少秒因为kbn都是小于1e6,所以直接做数字会非常大,但是我们发现其实只要到了某一时刻,从1开始增长的细菌恰好大于等于t,之后的剧情就会完全类似,所以只需要从1开始求,求其刚达到t 的时间即可#
2016-09-07 11:32:46
293
原创 codeforces 197C Lexicographically Maximum Subsequence
给一个只含小写字符的字符串,求其字典序最大的子集并输出先后按字符的字典序降序和其对应下标升序排序,然后贪心输出即可#include #include #include #include #include #include #define rep(i, j, k) for(ll i = j; i <= k; i++)#define ll long long#def
2016-09-07 11:18:55
545
原创 codeforces 195C Try and Catch 字符串处理
字符串题目,题目给出一系列try - catch (xxx, "..."),表示在这个区间中找输出为xxx的部分,如果找到则输出相应的内容,问最终的屏幕输出用类似栈的思想,这样就只需要处理跟结果有关的字符串,然后就是注意空格啥的#include #include #include #include #include #include #define rep(i, j
2016-09-07 11:15:19
353
原创 codeforces 194C Cutting Figure
给一个n乘m的方格,每个格子是障碍或者空地,空地之间是四联通的,问最少在几个空格子放上障碍,可以使得原图不联通、首先自己想想可以得到,答案不是1就是2,然后问题就简化为了检验原图是否存在割点的问题,直接dfs就可以#include using namespace std;typedef double ld;typedef long long int64;typedef
2016-09-07 11:08:26
337
原创 codeforces 192D Demonstration
题意:相当难读的题,政府有n块场地,示威者要申请m天的场地进行示威,场地是m块不同的,政府有k 元,每当示威者进行一次申请,政府可以付出对应的费用拒绝,至少要保证把最坏的 (也就是第n块场地)给示威者,场地好坏从1-n递减,问示威者最好能得到哪块场地直接贪心就行,先判断钱能否拒绝所有的场地,具体看代码#include #include #include #include
2016-09-07 11:03:20
406
原创 codeforces 192C Dynasty Puzzles 字符串动态规划
给定n个字符串,问通过互相连接所能组成最长的字符串长度是多少,连接时必须满足前一个字符串的末尾和后一个字符串的首字符相同,而且最终的得到的字符串的首尾必须相同用f[i][j][k]表示前 i 个字符串首尾字符分别是j,k时的最优解,直接转移就可以。唯一值得注意的就是同样的状态,有可能随着转移,其最优解会发生改变。哦还要用滚动数组#include #include #incl
2016-09-07 11:02:06
230
原创 codeforces 190C STL 字符串处理+栈思想
给一个pair的嵌套声明去掉标点的字符串,然后让你加上标点使得新的字符串符合语法规则整体递归的思想,注意要将pair 作为一个整体 #include #include #include #include #include #include #include #include using namespa
2016-09-07 01:09:08
478
原创 codeforces 189D AlgoRace
有m种车,给定每种车从城市i到城市j的时间话费cost[i][j],有 r 个询问,每次询问从 i 到 j ,最多换 k 次车类型的最小时间花费用cost[i][j][k]表示用第 i 种车,从j 走到 k的最小花费,读入花费矩阵之后,注意用floyd预处理,保证cost[i][j][k]是最优。然后用f[i][j][k] 表示换i 次车从 j 到k 的最优解,然后每次询问直接输出就行
2016-09-07 00:52:18
299
原创 codeforces 189C Permutations
给两个不同的1-n的排列a和b,你每次可以把a数组最后一位的数字插入到任何位置,求从a转换到b的最小操作次数首先将a相对于b排序,然后找第一个 i 满足a[i] > a[i + 1],然后答案就是n - i#include #include #include #include #define rep(i, j, k) for(ll i = j; i <= k; i++)
2016-09-07 00:31:38
351
原创 codeforces 186C Plant
题意:每次把一个相反的(正倒相反)的三角形放到每个三角形中切割原来的图形,问n次切割后有多少个小三角形?公式题,忘记特判0的情况wa了很多次!!!以后一定要注意边界情况#include #include #include #include #include #include #define rep(i, j, k) for(int i = j; i <= k;
2016-09-07 00:27:23
309
原创 codeforces 180F Mathematical Analysis Rocks!
#116 div2给一个长度为n的序列a表示起初第i个人拿着第a[i]个人的作业,再给一个同样长度的序列b表示最终i拿着b[i]的作业,求序列p。序列p是一个1-n的排列,表示每过一天后,i 要把他手中的书给p[i]直接将(ai,bi)二元组排序,然后输出排序后的b数组即可#include #include #include #include #include
2016-09-07 00:19:01
609
原创 codeforces 180E Cubes 双指针经典题
#116 div2一个长度为n的序列,每个格子被涂成了m种颜色中的一种,让你删除不超过k个格子,使得得到的新序列中,同样颜色的子序列长度最大,并输出这个长度首先预处理,用vector把同种颜色的格子的下标记录下来,然后用双指针枚举相同颜色的前后区间,通过下标的加减来计算不同颜色的格子的数目,如果小于等于k那就更新答案#include #include #includ
2016-09-07 00:15:58
426
原创 codeforces 180C Letter
给一个包含大小写字符的字符串,让你每次将一个字符的大小写转换,问最少操作几次才能使得字符串是一些大写字母在前+一些小写字符在后的情况首先预处理出f[i]表示前i个字符中,小写字符的数目,然后o(n)枚举大小写字符的分界线,同时计算并更新答案即可#include #include #include #include #define rep(i, j, k) for(int
2016-09-07 00:10:30
426
原创 codeforces 166E Tetrahedron 数学题
题意:一个蚂蚁在正四面体的一个角,每秒都要移动一下去另外一个点,问n秒后又回到起点的方案数设f[i]是 i 秒后走到abc的方案数,g[i]表示 i 秒后走到d的方案数,所以g[i] = f[i - 1] * 3, f[i] = 2 * f[i- 1] + g[i - 1]#include #include #include #include #define rep(
2016-09-07 00:02:42
357
原创 codeforces 166C Median 中位数
#113 div2题意:给n个数的序列,问最少添加多少个数字,使得序列的中位数是m?暴力排序,首先注意如果序列里没有m那么添加一个m是必须的,然后就是对于每个m,判断其前后分别有多少个数字,通过计算要加几个数字来把当前数字推到中位数位置#include #include #include #include #define rep(i, j, k) for (
2016-09-06 23:48:46
370
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人