随笔分类 -  搜索题

摘要:题意:给出两条平行的线段AB, CD,然后一个人在线段AB的A点出发,走向D点,其中,人在线段AB上的速度为P, 在线段CD上的速度为Q,在其他地方的速度为R,求人从A点到D点的最短时间。分析:居然要用三分,哎,怎么也没想到,先在AB上三分,固定一个点,接着在CD上三分,就是嵌套的三分搜索,思路清晰的话,代码也不是很难敲注意精度还有边界的处理View Code #include<iostream>#include<algorithm>#include<math.h>using namespace std;struct point{ double x,y;}; 阅读全文
posted @ 2012-02-12 21:09 枕边梦 阅读(306) 评论(0) 推荐(0)
摘要:hdu3756题意:在一个三维空间里,已知有N个点,求一个最小的圆锥使所有的点都包含其中。分析:主要有俩个步骤,首先就是将三维空间转化为二维空间,将所有的点都转化都同一个平面内考虑,通过将(X,Y,Z) 转化为(sqrt(x*x+y*y),Z),问题就转化为求一条直线将第一象限内的点全部包围起来。即,求满足条件的h,r 使得 h*r*r最小对于单调函数的表达式,我们可以采用二分搜索,但对于这种凸函数或凹函数求极值,我们可以采用三分搜索,给定h的上下限,三分h搜索即可。这里有三分搜索的介绍,挺不错的http://www.crazyhotice.com/2011/07/%E4%B8%89%E5%8 阅读全文
posted @ 2012-02-12 16:06 枕边梦 阅读(642) 评论(0) 推荐(0)
摘要:很明显的二分搜索,注意一下精度就OK了我所知道的二分有俩种写法,注意一下循环的控制其一#include<iostream>#include<algorithm>#include<math.h>using namespace std;double cal(double x){ return 8*x*x*x*x+7*x*x*x+2*x*x+3*x+6;}int main(){ double y; int T; scanf("%d",&T); while(T--) { scanf("%lf",&y); if( 阅读全文
posted @ 2012-02-12 02:26 枕边梦 阅读(291) 评论(0) 推荐(0)
摘要:题意:一种翻转棋游戏,对当前的棋局,问黑子下一步最多能将几个白子翻为黑子,(当前黑子与原先棋盘中的黑子的连线中间的白子会翻成黑子)分析:很简单的搜索题,不过一开始一直WA,实在无语,一直忽略了一种很情况,就是下一个黑子之后,不一定至于棋盘中的一个黑子连成线,也可以是多个,这时候应该将白子数加起来,而不是求最大者,………………hdu3368#include<iostream>#include<algorithm>using namespace std;char g[10][10];int dir[8][2]={{1,0},{-1,0},{0,1},{0,-1},{-1,1 阅读全文
posted @ 2012-02-10 00:47 枕边梦 阅读(218) 评论(0) 推荐(0)
摘要:题意:三维的空间,给定起点和终点,要求最少的步数。分析:一般的 广搜,就是读入这个图有点麻烦,弄晕了#include<iostream>#include<algorithm>#include<queue>using namespace std;char map[11][11][11];bool vis[11][11][11];int dir[6][3]={{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}};int n,ans;int ei,ej,ez;struct node{ int x,y,z,cnt; 阅读全文
posted @ 2011-12-10 15:20 枕边梦 阅读(170) 评论(0) 推荐(0)
摘要:题意:给一个4X6的矩形,有white ,blank , grey 三种颜色各有8个格子 ,给定一个初始状态,求用最少的操作次数将图形变化为中间的8个格子颜色相同。分析:话说,因为做过了hdu1667,一开始真的以为IDA*稳过的,敲完之后,直接TLE了,实在不解啊,原来是有测试数据的量太大了。按照大牛的思路是这样的:当我们确定了要将中间转成什么颜色之后,转的时候发现,另外俩种颜色也就没必要区分了,所以也就可以看成是只有俩种颜色了,之后用24个位保存状态,用BFS预处理从最终状态到每一个状态需要的最小步数。最后再根据所给的图,判断将哪种颜色转到中间的步数最少即可。虽然知道是这样的思路之后,还是 阅读全文
posted @ 2011-12-10 14:40 枕边梦 阅读(305) 评论(0) 推荐(0)
摘要:题意:#字形的图形,问将中间那一块转成相同数字需要的最少步数,输出字典序最小的路径。分析:跟hdu2234的无题I比,相对简单一点。其实也只是估价函数好理解一点,其他都差不多,还是迭代深搜+A*,也就是IDA*。估价函数h()=8-max(在要求的八个位置中,1,2,3,的个数);很好理解,因为没转动一步,最多只能将一个位置改为正确的。所以当前状态下,剩余的最少步数=8-max(在要求的八个位置中,1,2,3,的个数);#include<iostream>#include<algorithm>using namespace std;int map[8][8],step; 阅读全文
posted @ 2011-12-08 20:43 枕边梦 阅读(341) 评论(0) 推荐(0)
摘要:IDA*就是基于迭代深搜上的A*算法,最主要的就是在迭代深搜的过程中加了一个估价函数,关键还是这个估价函数的构造,ORZ,少了这个估价函数,对于这题目的话,直接TLE的说。这题目的估价函数是这样的,根据目前的地图简单的判断一下至少还要转多少次吧。这个估价函数“每次移动改变四个点的位置,即h()=(最少可能的横向或纵向不在位置上的点的个数+3)/4 )”,是参照大牛的。至于这么判断的,就要结合代码好好理解了……至于迭代加深,在之前的题目已经接触过了#include<iostream>#include<algorithm>using namespace std;int ma 阅读全文
posted @ 2011-12-08 19:20 枕边梦 阅读(410) 评论(0) 推荐(0)
摘要:题意:其实就是泡泡龙的游戏,给你起始的地图,以及刚打出去的泡泡的位置,如果与刚打出的泡泡相连的泡泡数大于等于3,则相连的相同颜色的泡泡会掉下来,之后,没有与顶层泡泡直接或间接相连的泡泡也会掉下来。问掉下来的泡泡总数。分析:其实就是模拟一下就可以了。首先将与起始点直接或间接相连的相同颜色的泡泡标记一下,看总数num是否大于等于3.all表示起始时的泡泡总数之后要分俩种情况讨论了:1) num<3 。那么要将之前的标记清除,找出与顶层泡泡直接相连或间接相连的泡泡总数ans,all-ans就是答案了。这里解决了一个特殊情况,本来以为num<3的话,直接输出0就可以了,但其实很有可能,即使 阅读全文
posted @ 2011-12-07 13:57 枕边梦 阅读(522) 评论(0) 推荐(0)
摘要:题意:从n个串中找出一个最短的公共串(也许应该说序列吧,因为不要求连续,即只要保持相对顺序就好)。分析:一开始自以为是爆搜开了,因为已经知道了可以用迭代加深搜索。所谓迭代加深搜索,就是每次都限制了DFS的深度,若搜不到答案,则加深深度,继续搜索,这样就防止了随着深度不断加深而进行的盲目搜索,而且,对于这种求最短长度之类的题目,只要找到可行解,即是最优解了。所以就这样敲完代码了,敲完之后,悲剧TLE。少了一步十分重要的剪枝,就是每次DFS的时候,都要判断一下,当前的深度+最少还有加深的深度是否大于限制的长度,若是,则退回。#include<iostream>#include<a 阅读全文
posted @ 2011-12-06 20:15 枕边梦 阅读(973) 评论(0) 推荐(0)
摘要:题意:给你一个图,图上每个点的信息表示该点的水流方向,若下一步走的方向与水流方向一致,则消耗能量为零,否则消耗能量为1,这样,给定起点和终点,问最少消耗的能量。分析:比赛的时候,一开始交了一个思路很简单的代码,就是用优先队列实现,主要就是标记点的问题了,因为即使使用优先队列,如果当初将一个状态标记为0和1,那么有可能在后面存在“已访问的状态消耗的能量大于即将到达那个状态所消耗的能量”,这样,就无法保证消耗的能量最少了。所以,初始的时候,将每一个状态消耗的能量初始为无穷大,之后,当遇到到达该状态消耗更少能量的,则压入队列。这样就保证了消耗能量最少的问题了。但是,但我把这份很容易敲完的代码叫上去之 阅读全文
posted @ 2011-12-05 17:32 枕边梦 阅读(944) 评论(0) 推荐(0)
摘要:额,题意:给定一个4*4的黑白棋盘的初始状态,判断能否通过满足一些给定的翻转规则,使得所有棋面的颜色都一样,如果可以,输出最小步数;分析:我一点优化都没有,直接BFS暴搜,中间有一个state整型变量保存整个图的当前信息,因为总共就16个位,所以刚刚,取出一个状态的 时候,再将state转换为图,可能直接在每一个状态里面保存图回更快些吧,内存应该也不太#include<iostream>#include<algorithm>#include<queue>using namespace std;struct node{ int cnt; int state; 阅读全文
posted @ 2011-12-02 14:09 枕边梦 阅读(229) 评论(0) 推荐(0)
摘要:题意:大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为。因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样多。但seeyou的手中只有两个杯子,它们的容量分别是N 毫升和M 毫升 可乐的体积为S (S<101)毫升 (正好装满一瓶) ,它们三个之间可以相互倒可乐 (都是没有刻度的,且 S==N+M,101>S>0,N>0,M>0) 。聪明的ACMER你们说他们能平分吗?如果能请输出倒可乐的最少的次数,如果不能输出"NO"。分析:直接搜索+模拟对于N和M俩个杯子的当前状态,每次都有俩 阅读全文
posted @ 2011-11-26 14:51 枕边梦 阅读(250) 评论(0) 推荐(0)
摘要:题意:已知起点和终点,找出最挖洞最少的路径普通的BFS()就可以了,我想说,天呐,我忘记清空队列 ,模拟赛时候狂WA了#include<iostream>#include<algorithm>#include<queue>using namespace std;int vis[1001][1001],n,m,si,sj,ei,ej,ans;char g[1001][1001];int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};struct state{ int x,y,cnt; state(int _x=0,int _y=0 阅读全文
posted @ 2011-11-26 13:25 枕边梦 阅读(257) 评论(0) 推荐(0)
摘要:我实在是无语了,为什么一定要用scanf("%s",map[i])或者 gets(map[i]),我用scanf("%c",map[i][j]) 就wa了n次还是错改了之后,一次就A了题目的意思比较好理解,就是Z占据了主导权,S一直跟着Z做反方向的运动,若S遇到墙,则原定不动。这题目是一个比较基础的BFS吧,只需要用一个四维的数组标记俩个人的状态#include<iostream>#include<algorithm>#include<queue>#include<math.h>using namespac 阅读全文
posted @ 2011-11-26 12:53 枕边梦 阅读(179) 评论(0) 推荐(0)
摘要:题意:考虑一个由1到N(N=3, 4, 5 ... 9)的数字组成的递增数列:1 2 3 ... N。现在请在数列中插入“+”表示加,或者“-”表示减,“ ”表示空白(例如1-2 3就等于1-23),来将每一对数字组合在一起(请不要在第一个数字前插入符号)。计算该表达式的结果并判断其值是否为0。请你写一个程序找出所有产生和为零的长度为N的数列。分析:DFS枚举就好了关键就是 处理‘ ’,用last保存最近的一个连续的整数,不将该数进行运算,sum表示last之前的运算结果若当前选择了 ' ':sum=sum-last+last*10+s+1(last>0);sum=sum 阅读全文
posted @ 2011-11-13 16:28 枕边梦 阅读(239) 评论(0) 推荐(0)
摘要:题意:农民JOHN以拥有世界上最健康的奶牛为傲。他知道每种饲料中所包含的牛所需的最低的维他命量是多少。请你帮助农夫喂养他的牛,以保持它们的健康,使喂给牛的饲料的种数最少。给出牛所需的最低的维他命量,输出喂给牛需要哪些种类的饲料,且所需的饲料剂量最少。维他命量以整数表示,每种饲料最多只能对牛使用一次,数据保证存在解。输出:输出文件只有一行,包括牛必需的最小的饲料种数P后面有P个数,表示所选择的饲料编号(按从小到大排列)。如果有多个解,输出饲料序号最小的(即字典序最小)。分析:总共有十五种饲料,要找出符合能满足条件的最少的种数,相当于要求出一种组合,那么就求出各种长度的组合,再找出符合条件的最小字 阅读全文
posted @ 2011-10-26 18:46 枕边梦 阅读(698) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3810题意:Magina 去打怪,目的是在最短的时间内得到m units money。已知有N个怪分布在N个地点,打每一怪可以获得gi money,但同时也需要花ti 时间。Magina 可以任意的选择一个怪开始打,已知他又一个技能,就是瞬间移动啦,从一个地方到另一个地方,不需要花费时间,但前提是这俩个地方是相连的,打完一个怪之后,该怪物就会消失,同时那个相连的路也会跟着消失。分析:大致题意就是这样了,一开始就是直接搜啦,很笨的方法,是因为没注意到一个问题,“For every spots, Mag 阅读全文
posted @ 2011-10-25 18:29 枕边梦 阅读(292) 评论(0) 推荐(0)
摘要:哎,纠结了那么久,终于过了,本来很直接的想到了BFS,可是怎么纠结也过不了,orz……还是用DFS了,嘿嘿,一开始好囧,没注意到,其实每一种方法最多只能走四次,走四次就回到初始状态了;DFS的过程比较好理解,从第一种方法开始,枚举这种方法走到次数,接着第二种方法,…………,这样,知道 第九种方法,再判断是否满足条件……/*ID: nanke691LANG: C++TASK: clocks*/#include<iostream>#include<algorithm>#include<fstream>#include<string.h>using n 阅读全文
posted @ 2011-10-19 12:02 枕边梦 阅读(178) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4012下面分析转自大牛:http://www.cnblogs.com/ambition/archive/2011/09/08/Paint_on_a_Wall.html题目大意:给出一个2×n的矩阵(n<=8),每次给一个矩形染色,之后的染色覆盖以前的颜色,问到达目标状态需要多少次看到题目数据量想到了要用搜索去做,想了很久才想出搜索方法,搜索题中的极品啊~~因为每一次涂色肯定会有至少一块颜色是最终显示的颜色,所以用状态记录每一块是否是最终显示的颜色,因为只有2×8块,用二进制 阅读全文
posted @ 2011-09-20 19:56 枕边梦 阅读(498) 评论(0) 推荐(0)