HDU 6071 Lazy Running

第一次刷到HDU第一名,趁现在没人比我高,截图来一发!!!! 对于这道题,我只想说一个字 妙!!!! 题意: 给你四个点,(1,2),(2,3),(3,4),(4,1)之间都有一条无向路径,让你从 2 号点出发,最后回到2号点,同时使得走过的距离大于等于 k ,并且 最小。 k很大,最大达到 1e18 ,四条路的范围不大于 3e4 。 思路: 这道题真的是太妙了!!! 说一下我比赛前后的思路,这里我称 从 起点 2 回到 2的回路为 E 回路。 先说一下我比赛的思路: 一开始我的思路是这样的,首先不考虑单纯的往返,那么E回路就有7种情况。 那么我考虑复杂度的话最多的就是4点成环且只有4条边的情况,对于这条已有的E回路,我们可以在任意一条路径走来回走,使得路径长度增大。 那么我们就可以将问题转化成为…

CodeForces 295C Greg and Friends

bfs + dp 好题。 真好,比赛的时候想不出来,看题解的时候感觉好复杂…… 看完写的时候感觉非常流畅! 题意: 载人过岸,一艘船最大载重 k 已经给定。每个人的重量只会是50或者100。问最小的过岸次数与方案数。 思路: 老实说这个题目我可以看就知道是道搜索题,因为和那个什么东西(就是搜索入门的那个)来着非常像。 最重要的还是理清状态与思路。 以左岸50重人数,100重人数,船是否在左岸表示一个状态,对他进行 bfs ,只要满足船重量大于 0 并且小于等于最大 k,每次过岸花费 1 。第一个搜索到 最终状态的就是我们要求的结果。 而我们的方案数,只能通过dp来球,dp最讲求的就是状态, 转移方程如下: 如果是 左岸 — > 右岸 anum表示 50重总人数 , bnum 表示 100重 总人数 ( dp[x][y][0]…

HDU 1043 Eight

康复计划之搜索 1 因为有个小学弟在第二天就说ida * 看不懂,搞得我挺慌 我可以说我也不是很熟么 题意: 经典八数码 思路: 这里提供的是单向bfs + 打表思路,本来想复习ida * 但是不小心看到了kuangbin的思路,就写了一下。 简单说就是我从起始状态 123456780 开始对0进行bfs,通过康托展开的hash函数进行记录状态和路径。询问时对哈希值进行询问和查找。 实际上并没有用到康托展开的性质,只是通过2进制hash而已…… #include #include #include #include #include #include #include #include using namespace std; const int maxn = 400000; int fac[] = { 0, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880 }; str

UVa 11624 基础BFS

白书训练指南上的第一道基础题,因为它在搜索中引入了超级源点,所以我自己试着做了一下,真的宛如发现新大陆一般,图论的建图技巧真的是在整个图论领域都十分适用啊。 因为UVa的尿性,写完去搜一下题解,居然有很多题解都是两次 bfs ……真是笑了 题意: 一个起火的迷宫,有很多起火的地点,给你初始位置,和起火地点,你的逃跑速度和火焰蔓延速度相等,问你能否跑出迷宫,若能,输出最短时间。 思路: 网上那些两遍bfs的应该是先一遍bfs处理出火焰蔓延到每一个格子的最短时间,在自己bfs时间加个时间大小判断的限制。 然而实际上,我们溶入超级源点的思路,然所有点一起开始跑,在同一个时间内,让所有火焰先跑,并加以标记,而人则把火焰和墙壁一起处理,避而不走。 AC Code #include #include #include #include #include #include #include #include using n

HDU 1664 Different Digits

稍微有点不一样 这次衡量的第一标准是位数的多少 第二标准才是数的大小 这里必须有一个 数论的 知识 不然不好写(I hate number theroy …… 对于任意的整数n,必然存在一个由不多于两个的数来组成的一个倍数。(之前写过数位BFS的应该可以理解 因为a,aa,aaa……取n+1个,则必有两个模n余数相同,相减即得n的倍数m。而m只由a、0组成。(这可以说是最糟的情况 所以只要先枚举所有的 1-9 的数 如果不存在 再枚举两个数的情况 (一直很奇怪网上的题解 0-9 不是有 45种情况么………… 还有 。。。沃特么也是SB 被自己坑到了 我还以为必须是他给的数 的位数作为范围 因为样例就是这样的…… 结果WA了好几发 AC Code #include #include #include #include #include #include #include #include

HDU 1226 超级密码

中文题我就不说什么了 最近写的一道 数位bfs (个人取名……若有误还请提出更正) 结果马上就用上了 只不过题意更加明显而已 (之前还以为是很高级的想法 没想到只是在高级搜索的 Level 1 推荐出现 心酸…… 其实还是和之前写的代码差不多拉 我自己消化了一下 坑点:1 注意判断 n == 0的时候 2.密码长度超过500 就不用继续了 AC Code #include #include #include #include #include #include #include using namespace std; const int maxn=5005; const int inf=0x3f3f3f3f; int n,m,k,num[20],ans;

HDU 4634 Swipe Bo

玛德 我现在特别想骂人 这道题真特么的坑爹 坑爹 坑爹 航电你就不能吧数据搞的好一点么 写了我几乎整整一天 我也不想多说什么了 真的 让我静静 这时间浪费的太不值了………… #include #include #include #include #include #include using namespace std; char g[220][220]; int sx,sy,ex,ey; int row,col,keynum; bool flag[202][202][1<<7][4]; int mve[][2] = {{-1,0},{0,-1},{1,0},{0,1}}; struct node { int key,num; int x,y; node(){} node(int _x,int _y,int change=0,int status=0):x(_x),y(_y),key(status),num(change) {}

POJ 3503 Summits

再一次感慨英语是多么的重要 今天打比赛写到这题一直看不懂 尤其是最关键的那个双重否定一出来我整个人就懵逼了 我还是弱弱的简单说一下题意吧 题意: 就是给你一个二维数组 每个值表示高度 给你 长 宽 和一个数d 如果一个点高度为h 只走 高度大于 h-d 的点并且达不到一个更高的点 那么这个点就是一个峰值 求峰值的数目 思路 : 贪心 从最高点出发搜索 比它小的和它连通的都标记成 原点高度 既可以标记 又可以减少访问 后面访问见注释 下面附上代码和注释 第一次用了STL的队列和优先队列 结果TLE 无奈用了模拟队列试了一下就过了 AC Code #include #include #include #include #include #include using namespace std; const int maxn=505; int row,col,d; int