- 博客(13)
- 收藏
- 关注
原创 HDU-4288
题意:一开始有一个空的数列,下标从1开始,然后给定三种操作:1、向数列里添加一个数字。2、删除数列中的一个数字。3、查询由小到大排序后的数列中所有下标值对5取模为3的数之和。解法:我们可以用线段树来解决这个问题,首先将所有的操作保存下来,再将操作中所有出现的数字排序然后去重,离散化后建树即可。(也就是离线操作)线段树中每个节点保存当前区间内有多少数字,以及下标值
2016-10-20 17:18:05
386
原创 HDU-2437
题意:给出一个带有n个节点和m条单向路径的图,保证图里没有回环,从s点出发,找到一条路径的终点的属性为‘P’,并且路径的长度要能够整除k。注意:路径要找最短的,如果有不止一条最短路径,那就选择终点编号最小的。思路:用BFS和DFS都可以做,但剪枝的方法是一样的,用一个1000*1000的数组来保存当在节点i时已走距离j模上k的最小值,即min[i][j%k],当已走距离大于min[
2016-08-02 22:03:59
267
原创 HDU-1067
求最短路的问题还是用广度搜索,但问题在于判重不好办,不判重又会暴内存和超时,所以参考了一下别人写的哈希表进行判重。将4*8的矩阵内的数字按照各自的权值相乘之后加起来对一个素数求模即可得到该状态所对应哈希表的下标。如果有重复就乘10再模一次。#include #include #include using namespace std;struct node{ int
2016-08-02 21:49:15
447
原创 HDU-1685
思路:注意到题目中超过四次就不用再往下算的要求,说明搜索步数非常少,比较适合用迭代加深的算法。但是暴搜多半会超时,所以问题在于如何剪枝。举个例子:当1 4 5 2 3 6转换成1 2 3 4 5 6时有三个地方从无序变成了有序:1 4->1 2,5 2->3 4,3 6->5 6,这是一次转换后能得到的最好情况,可以依照这个来剪枝。对于每个转换后数列求出其有多少无序的地方,将改值除以三后和
2016-08-02 21:45:25
324
原创 HDU-5775
题意:给出一个数列,数字不会互相重复,求每个数字在冒泡排序时所到达的最右点到最左点的距离。思路:思考一下会现其实这题就是在问你每个数字的右边有多少个比它小的数字。可以用线段树或者树状数组来解决,遍历一遍数列,每个数字都进行一次插入和查询操作。以线段树为例:插入:将num[i]+1~n这个区间插入到线段树中,使这个区间中的节点的值加一。查询:对于num[i]来说,num[i]~n
2016-08-02 21:11:47
404
原创 HDU-5433
思路:BFS+优先队列,用一个50*50*50的double数组判重。注意!!!题目里的x和y是反着的,也就是说,x对应n,y对应m。例: n = 3,m = 6 时地图为:**?***************“?”为(x=1,y=3)浪费了一下午的时间。。。#include #include #include using namespac
2016-07-29 16:37:29
269
原创 HDU-2128
这题写的比较暴力,因为地图大小只有8*8,所以在队列的节点里保存了两张地图,一张用来保存地图的情况,另一张保存在该节点时手上炸弹数量的最大值。如果走到该节点时手上的炸弹数量小于或等于最大值则不再往下走,注意初始化时最大值全部设为-1。#include #include #include using namespace std;struct node{ int x,y,t,b
2016-07-28 10:35:47
315
原创 HDU-3533
题意:有一个n+1*m+1大小的图,在这个图上有一些炮台,这些炮台会每隔一段时间就射出一发子弹,不同的炮台射出的子弹速度也不一样,人从(0,0)出发到(n,m),如果能量耗尽或被子弹射到就算结束,求到达目标点的最短时间。要点:1、只有当人和子弹同时到达同一点时,人才算被射中,否则即使人穿过子弹也没事。2、子弹打到炮台或飞出去会消失。3、射击间隔为1的炮台在人的每一次行动都会射出
2016-07-28 09:32:30
710
原创 HDU-4101
题意:给出一个n*m的图,在这个图中有宝藏,以-1标记出来。0为路径,1-100为HP为该数字的石头。Ali和Baba轮流行动,Ail为先手。每次可以选择将一个外围(有路径能从外围直达)的石头的HP减1,当石头的HP减为零时,该点变为路径。当谁能先碰到宝藏(有路径能从外围直达)谁就获胜。思路:首先想到的是先找出带宝藏的连通块,然后将所有的石头的值加起来,如果该石头挨着连通块就加
2016-07-28 09:03:24
309
原创 HDU-4474
题意:给出一个1到10000的整数n,然后再给出一些不能用的数字(0到9),求在该限制下能够整除n的最小数字,如果没有就输出-1。思路:这题的基本思想还是对数字的每一位进行BFS,但是数字的位数最多能有10000位,暴力搜索肯定会超时,这里就需要剪枝。方法就是开一个大小为10000的数组对BFS判重,BFS的队列中保存每次对n取模的余数,这个余数作为数组的下标,一旦出现相同的余数就可以
2016-07-19 10:09:26
382
原创 cugoj-1697梦回三国
cugoj-1697来源:2016华中师范大学“计蒜客杯”F题题目大意:给出n个点和m条边,再告诉你你个点中哪三个点是目标地点,然后要你求出连接这三个目标地点的最短路径。解题思路:这是最短路问题,先对三个目标地点求出其到所有其他点的最短路径,将结果保存后对所有的点进行一次遍历,计算该点到三个目标地点的距离之和,然后输出最小的结果。为什么这么算能够确保结果是正
2016-05-18 12:45:07
898
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人