Fighting!

解题报告

1、hihoCoder 1513 小Hi的烦恼

题意大致是 每个人都有5科成绩,然后给出给个人5科成绩的排名,然后让你求对于每个人而言 全面碾压自己的人有多少?

思路:枚举的话O(n^{2}) 肯定会超时的,题解说这是一个5维数点问题。然后这个题目用bitset解决,复杂度变为O(n^{2}/32)。这个题目的代码非常简短,这个题目的代码非常简短,用bitset实现起来非常妙。先开一个数组stu[i] [j] 代表第 i 科排名第j的人是谁,然后再用位运算进行关系的传递!最后只需5科相与统计 1  的个数即可

解题报告点我

2、熄灯问题

题意:一开始给你一个表示灯的状态的矩阵,1表示灯亮,0表示灯灭,题目让您输出一个开关矩阵,使得原本亮着的灯全灭。

思路枚举 + 状压 。如果枚举每一盏灯肯定会超时,其实换个角度想想,我们可以 枚举局部来确定整体,只枚举第一行灯的状态,2^6 = 64中状态就可以了。我们可以开一个字符数组,用每一个bit来表示一盏灯,然后到最后只需要判断最后一盏灯是否是全灭就可以了。

 这个题目可以算是一个状态压缩的经典问题了,把这个问题的思路搞懂,就可以轻松解决其他问题。

解题报告点我

3、poj 3279  Fliptile

题意 和上边熄灯问题差不多,但是区别是这个题目,要求你输出最少的方案。

思路:也可以是枚举 +状压。但这个题目是搜索专题的一道题目,搜索解法先留个白。

解题报告点我

4、hdu2612 Find a way

题意:大致是两个人Y 和 M 要去@(KFC)相聚,问他们相聚的最短时间。

思路:BFS。分成两个图,一个用bfs跑Y去所有可到达的@的最短路径,一个用bfs跑M去所有可到达的@的最短路径,分别记录下来,然后求后求和取最小值。有一点我没从题目中读出来,就是Y和M各自所占的地方是否可以互相到达,试了下不可以,也就是说对于Y来说,M相当于‘#’。

解题报告:点我

5、uva 11624 - Fire!(BFS)

题意:问J能否在火烧到他之前 跑出这张图,J只能上下左右走到可走的位置,火往四周蔓延。

思路:注意此题可能有多团火!!!然后需要把所有火都扔进队列里,跑一次BFS,然后记录下来火到达可走地方的最短时间。

然后让J也跑一次BFS,只有J到达可走地方的时间小于火到达这儿的时间才能走过去。

解题报告:点我

6、FZU Problem 2150 Fire Game(BFS枚举)

题意:就是在有草坪(#)的图中,让你放两把火(可以放在同一块草坪上),然后问你把所有草坪烧灭的最短时间,如果不能全部烧灭,就输出 - 1。

思路:DFS判断图的连通,如果有两个以上或者0个连通则输出 - 1;在DFS同时记录坐标。然后枚举坐标进行BFS记录最短路径路径。因为这个数据范围太小了,所以不会超时。

解题报告点我

7、poj3268 Silver Cow Party(Dijkstra+矩阵转置 | 堆优化的Dijkstra)

题意:1到N头母牛去M农场去参加派对,每头牛都会选则最近的路程,在有向图图中往返,求N头牛中最长的时间。

 思路:这个题目重新做了一遍,一遍有一遍的收获。一开始想进行N+1次Dijkstra,结果T到怀疑人生,想用堆优化,但是不会,看别人的博客后发现这题真巧妙。求多源到单源有向图最短路,不必调用N次Dijkstra,矩阵转置一下,反过来求一次单源到多源Dijkstra就可以。总共两次Dijkstra算法。

解题报告点我

8、poj2253 Frogger(最短路变形)

题意:看了许久没看懂,看了别的博客解释,即求1(起点) -  2(终点)的所有路径中最大道路的最小值

思路:Dijkstra变形。相同路径取最大,不同路径取最小

解题报告解题报告

9、poj1797Heavy Transportation(最大生成树 | 最短路变形)

题意:让你求1 - n所有路径中最小道路的最大值。

思路:可以用最大生成树,将边从大到小排序,然后添边,直达1 ,n两点连通时,那条边即所求解。最短路变形,这个求最小道路的最大时需要改变初始化条件。d[ ] 初始化为负无穷,d[ u ] 初始化为正无穷,然后重载为大于号,改变不等式方向即可。‘
解题报告点我

10、poj1860 Currency Exchange(最短路变形:spfa判环)

题意:这里有N种货币,分别记为1~N,有M种货币交换的方式,每一种方式有A,B两种钱币,有RAB, CAB, RBA and CBA,四个数,表示交换率, Nick手上有其中的一种货币S,货币S的钱数为V,问你能否通过一定次数的钱币交换让Nick手中的钱S增加。

思路:因为可以无限次兑换,所以如果从S出发最后使得S增加的话,一定会形成一个正环。用SPFA就好了,还有就是,三角不等式需要变形一下,列如A 到B汇率为r,佣金为c,然后需要 把 k个A换成B是(k - c)*r,所以要是以A点松弛的话就是,d[B] = max(d[B],(n - c)*r));
解题报告点我

11、poj1062 昂贵的婚礼(有约束的最短路 + 超级源点 )

题目大意是说有N个物品,每个物品都有自己的价格,但同时某些物品也可以由其他的(可能不止一个)替代品,这些替代品的价格比较“优惠”,问怎么样选取可以让你的花费最少来购买到物品1,1永远是酋长的许诺。

思路:

这个题目难在建图,首先分析清题意,把所有的物品看做商品。一行给出商品的价格,等级,可替换商品数量,价格是获取这个商品的价钱是多少,可以加一个虚拟源点,然后权值为商品自身的价格就解决这个问题。可替换的商品指的是用 某个商品替换后的价钱,本题中,可能比原商品便宜,也可能贵;例如1商品的可替换为 2 8000,表示用2号抵押的话价值8000,所以只需要2 - > 1建一条有向边,权值为8000即可,这个问题也解决了。下面要求最少需要多少钱可以获得1商品,只需要求0 - > 1的最短路即可。

不过还有个限制,就是等级问题,每个商品都有一个等级,交易的所有商品最高最低不能超过M,由于1商品肯定是要交易的,所以只需要由1商品的等级确定上下界就行了,这里,我枚举的是等级下界,即交易所有的的商品中等级的最小值。
解题报告:点我

12、poj3159 Candies(差分约束  :基于栈的SPFA | 堆优化的Dijkstra)

题意

现在给n个小朋友分糖果,给出m条语句A B C表示小朋友A认为给B的糖果不能比自己多C(可以等于C),问小朋友N与小朋友1的糖果数量差最大是多少

思路

差分约束。将这种不等关系转化为图中的一条有向边,最后以1为源点跑一遍最短路,最后d[ n ] 就是答案。这题问的是1与N差值,所以不必管每个小盆友至少分的糖果的情况。

解题报告点我

13、CF  D. Distinct Characters Queries(树状数组 | set)

题意很简单,给你一个字符串,然后有两个操作

1 a b   把字符串中a 位置的字符 替换成b

2 a b 查询字符串中 a - b区间中不同字符的种类数

思路:

1、可建立26个树状数组,对应着26个字符所代表个数的前缀和,进行2操作时只需要进行26次循环查询对应区间有无这个字符即可,若有sum++

2、set存储字符所对应的字符的下标。然后2操作时,进行26次循环,看每个字符set中,有没有一个数在 区间内即可。

1方法比2方法快很多,还要注意一点的是,进行1操作时 ,别忘了改变原字符串,debug了很长时间(汗||)
解题报告点我

14、poj 3255 Roadblocks (A _star | 正反最短路枚举)

题意 就是让你找严格 次短路。

思路:可以用A star求,相比于求第k短路,要改一下返回条件,因为这个题目是严格次短路。也可以求正反最短路。即以起点为源点和以终点为源点的最短路d1[ ] ,d2[ ] ,然后枚举边,边的两个端点为u,v,这一条新的路径等于d1[ u] + d2[ v ] + dis。

解题报告点我

15、hdu1512 Monkey King(并查集 + 可并堆)

题意:

有 N只富有攻击性的猴子,第 i只猴子的攻击力为 ai 。猴子们之间会形成小团体。当猴子 A和猴子 B 发生争执的时候,猴子 A 的小团体中攻击力最高的猴子 P 会和猴子 B 的小团体中攻击力最高的猴子 Q 打一架。打架的结果是两个战士 P 和 Q的攻击力减半,并且连个小团体合并为一个小团体。(初始的时候每个猴子只和自己形成小团体,“减半”是指除以 22 并向下取整) 
现在已知有 M 次争执即将发生,第 i 次争执的主角是猴子 Ai 和猴子 Bi ,问每次战斗过后合并的小团体中攻击力最高的猴子的攻击力是多少?

思路:并查集 + 可并堆。

涉及到集合的合并问题,我们不免想到并查集。一开始可以给每个人设置一个堆,然后并查集合并的时候同时进行堆合并,因为数据范围1e5,为了避免超时,我们可以使用可并堆在logn时间内完成堆合。
解题报告

16、hdu6736 Forest Program (Tarjan 求 点双连通分量)

题意:让把仙人掌图 变成树,问至少有多少解决方案。

思路

要将仙人掌变成树(或者森林),只需要保证对于仙人掌中的每个环,至少有一条边被删去即可。设图中环的大小分别为c1,c2, ..... ck,不属于任何一个环的边数为b,则答案为 \mathbf2^{b}{\prod_{i = 1}^{k}(2^{c^{i}} - 1)}

解题报告

17、hdu4725 The Shortest Path in Nya Graph(最短路:建图拆点技巧)

题意:有n个点,每个点处于一个层次中,相邻层的点可以花费c相互到达,然后还有m条小路。问你从1到n的最短路。

思路:裸的最短路?题意是裸的,但如果你枚举层朴素建边的话。n^2,我一开使没注意n的范围,1e5,  结果T到怀疑人生。看dalao们的做法是拆点,需要注意的是题目没说同一层的点可以相互到达,所以别让主观意识影响你的判断,还要注意拆完点后不能使得同一层的点相互到达。

解题报告

18、51nod 1649 齐头并进(思维 + 最短路)

题意大致就是:让你求公交车和火车从1点到达n点的最小时间,也就是取个max,而不是min。。。。逻辑还是不行。。然后给你m条铁轨,然后题目说两个没有直接用铁轨连接的小镇之间会有条公路(我想了好大一会直接相连什么意思,原来就是字面意思),然后火车只能走铁路,公交只能走公路,每一段路都是1小时。还有一点是,火车和公交在途中不能同时停留在同一个 小镇。

思路:不能停留在同一个小镇?那怎么办,题目说两个没有直接用铁轨连接的小镇之间会有条公路,这句话想告诉我们什么?

也就是说任意两个城镇之间不是被铁轨相连,就是被公路相连,并且一个是直接到达,一个可能需要几次中转才能 到达(间接连通),也就是说在求最短路的情况下不必考虑会呆在同一个小镇的情况,所以做法就是分别两次最短路取max

解题报告

19、51Nod 1443 路径和树(边权和最小最短路径树)

题意就是让你输出一棵以u为源点的最短路径树的最小权值权值和。

思路:想象一下Dijkstra算法更新 的过程,依据贪心的思想,每次取出到源点最近的点,然后进行更新,把更新完的点在丢入堆中,这也是形成最短路径树的过程,所以我们可以在dijkstra的过程中多开一个p 数组,p [ i ]代表更新到 i 的所有边中的最短边,最后对p数组累加求和

解题报告

20、一本通1486:【例题1】黑暗城堡(最小路径树 方案数)

题意是让你统计以1为源点的最短路径树的方案数。

思路:

1、先求出 以1为原点的最短路 d[ ]  数组。然后按d数组从小到大排序求方案数,然后模拟求最短路的过程 按乘法原理统计方案数。

2、优化

上述 时间复杂度\mathbf{n^{2}} ,当n数据范围在大点肯定TLE,我们可以发现,双重循环寻找方案的过程其实类似于dijkstra求最短路的过程,只不过那个三角不等式换成了 等于号,所以我们依旧可以用堆 来优化这个过程然后使得复杂度降为\mathbf{n\log(n) }

解题报告

21、51Nod 1640 天气晴朗的魔法(最小生成树变形)

题意:让你输出一颗生成树的权值,首先,它的最大边权最小,其次权值和最大。

思路:最大边权最小,就是求一遍最小生成树,然后在已知小于等于最大边权集合的基础上求一遍最大生成树。

注意!!!在求最小生成树的 最后条件 cnt == n-1时,还要判断后续边 是否与它权值相等,相等的话也要加入集合中。
解题报告

22、hdu6740 MUV LUV EXTRA(KMP求循环节)

题意:给你一个浮点数,知道他是一个无限循环小数,然后给你一个a和b,让你计算这个字符串的可靠程度。可靠程度 = a*当前已经出现循环节的长度 - b*循环节长度。

思路:考察next数组的性质。循环节长度 = i - next[i]   所以只需要把小数倒转求一次next数组就可以了。

解题报告

23、poj1511 Invitation Cards(反向建图)

题意:一个有向图,让你求一遍1到其他点 的嘴短距离,然后求一遍其他点到1点的最短距离,加和输出。

思路:因为涉及到求多源点到 单源点的嘴短距离,所以需要反向建图,这样就变为单源到多源了。直接套模板就行。

解题报告

24、LOJ1074 - Extended Traffic(spfa + 负环检测)

题意就是说在一个有向图中,每个点都有一个繁忙值,然后两点之间的权值为 (终点的繁忙值 - 起点的繁忙值 )^ 3。会有q个查询,问1到他们的最短距离,如果 < 3或者不可到达输出-1。

思路:一看不就是最短路模板嘛。然后忘考虑有负边的情况。。。然后又忘记考虑不可到达里有负环情况,然后又忘记这是有向图里的负环情况。。。总之还是菜啊!

若存在负环,还需要把负环上的点标记一下,表示不可到达,可以用dfs标记。

解题报告

25、51Nod 1444 破坏道路(最短路 + 枚举)

题意就是这句话:现在你要破坏尽可能多的道路,但是要保证从城市s1到t1不超过l1小时,并且从城市s2到t2不超过l2小时。

思路:先求出两两之间的最短路,然后枚举公共路径,因为每一条道路的权值都是1,尽可能使得两路径之和最短并且符合题目要求,那么可破坏的道路的条数最大数是 m - ans。
解题报告

26、poj2502 Subway(建图)

题意:给你家和学校的坐标,然后在给你若干车站的坐标,人步行的速度是10km/h,火车的速度40km/h。问你从家到学校至少需要多少分钟。

思路:思路很好想,一看就是一个最短路的模板题。但是这个建图真是恶心死我了。前几天做了好几遍这个题目,一直结果不对,今天结果终于大差不差,然后又忘记不同铁轨之间可以步行建图。。。可以加一个vector数组用来保存已经出现的车站,没加入一个点就要与所有出现的点建图(步行),车站只有相邻才可以按火车速度建图。

解题报告

27、hdu3336  Count the string(KMP)

题意:给你一个字符串s,然后让你输出s中所有前缀在s中出现次数的和。

思路:KMP + dp。

KMP中Next数组的含义是前缀和后缀所匹配的最大长度。

先求出Next数组来。

然后设 f[ i ]   表示前 i 字符组成的串 前缀出现 次数 的 和。

 然后我们可以写出状态转移方程 来 : 

f[i] = f[i - 1] + 1 + ( Next == 0? 0: 1);

很显然如果Next[i]不为0,说明当前前缀和后缀是适配的。

解题报告

28、hdu3746 Cyclic Nacklace(KMP)

题意:给你一个字符串,然后问你添加几个字符能凑成循环串。

思路:

很显然,k = m / ( m - Next[m]) 为已经出现的循环节次数,l = m - Next[m] 表示循环节长度。用总的长度m - l *k为某一循环节剩余长度,然后再用 l - 剩余长度就是答案。

解题报告

29、hdu4763 Theme Section(KMP)

题意 :给你一个字符串,然后让你找一个子串,这个子串需要作为前缀、后缀 和 在中间出现。输出这个子串的最大长度。

思路:依旧是Next 数组的性质。首先明白Next数组的含义,Next[i] 表示 以 i 结尾的非前缀子串与前缀匹配的最大长度。

所以,整个字符串的后缀入手,如果Next[m] = 0,则肯定不存在这种子串,输出0即可。否则 Next[m] 肯定等于等于一个数,假设Next[m] = k ,表示该字符串前缀 与 后缀能匹配的长度,然后在 从 前面的位置中查看是否有Next[i] = k,如果有则k就是这个 最大长度。

不过需要特判一种情况,那就是形如 aaaaa这种字符串,前中后平分这个字符串,直接输出 m / 3即可。如果没出现在样例中,我真的可能想不起这种情况,后怕。。

解题报告

30、poj2185 Milking Grid(KMP)

题意:给你一个n*m字符矩阵,然后让你找一个子矩阵,这个字符矩阵可以由这个子矩阵(若干个)覆盖(可以重叠)。然后输出这个子矩阵的最小面积。

思路:一开始没想到怎么用KMP,看到别人的博客恍然大悟,相当于把多维矩阵映射成一个字符串处理。

矩阵的面积 = 长 * 宽。

找长度最小的长,把每一列看做一个字符。进行KMP匹配即可。 l =  m - Next[m]

找长度最小的宽 ,把每行看做一个字符,进行KMP匹配即可。 w = n - Next[n]

最后的答案 = l * w
解题报告

31、hdu1251 统计难题(Tire)

题意:查询单词作为前缀在字典中出现的次数。

思路:开一个数组在每次插入的时候记录每个节点应有的个数(j建树时经过的次数),然后查询的时候取路径上经过次数的最小值即答案。

解题报告

32、SPOJ Search in the dictionary!(Trie 递归寻串)

题意:一开始给你n个字符串,然后有m组查询,每一组查询询问是否字典中存在以此串为前缀的字符串。

思路:从昨天开始就一直Wa,神奇的是网上还没有相关题解。。。多亏了@子衿君 今天及时给我说我读错了题,并给了我AC代码。因为没有做过Trie遍历的相关题目,所以费了不小的劲才AC。

先找到插入字符的尾节点,当然,如果 字典中没有这个字符串直接退出即可。然后从尾节点开始往下遍历字符,常规dfs。
解题报告

33、hdu 5536 Chip Factory(枚举 + Trie)

题意:给你一个整数序列。然后让你求 (s[i]+s[j])^s[k] 最大的值,其中 i、j、k 各不相同。

思路:由于范围1000较小,但三重循环有可能超时,我们可以将这个整数序列构造成一个字典树,然后双重循环枚举两个数的和,变成了求 sum ^ s[k] 的问题,即求一个数与一个数列中数的异或值最大的问题,在Trie树上贪心的寻找。可是题目要求i, j ,k都不相同,那怎么避免 在Trie树上找到重复编号的数呢?

学习别的博主的代码,外加一个num数组记录每个节点的访问次数,然后删除的时候只需要遍历一遍路径,减去访问次数就行了。然后,在搜索的时候外加一个条件就是访问次数为0的节点不能访问。
解题报告

34、

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值