![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
2015暑期作业Orz
文章平均质量分 78
zz_Black
弱弱开始写题解
展开
-
Uva 12504-Updating a Dictionary(STL, map)
题目大意见紫书P136- -.大致思路:这道题其实就是一个暴力,看一个map里面的元素的值再另一个map里面是不是相等就行了,至于题目似乎要求字典序。。废话么map本来就是排好序的所以完全不应在意。只不过我把找‘+’ 和 ‘-'写到一个函数里面来减少代码量,当然这种强行减少代码量会多出许多小trick需要花时间解决。。真正比赛赶时间的时候无脑暴力怎么省时间怎么来就行了。具体细节见代码中的注释(原创 2015-09-08 18:22:56 · 334 阅读 · 0 评论 -
Light Oj 1194 colored T-shirts 经典状压dp
这道题跟2014微软编程之美复赛的一道机器人是一模一样的题。。首先预处理, cnt[i][j] =记录的是 在这个序列中可以取出的 不同的 对 ,(注意这里的i,j不是下标而是数), 而这个的意义是, 假如这个序列只存在i和j这两个数, 那么把i全部交换到j之前所花费的交换次数(毕竟每次交换i,j,就相当于少了一个 对);然后进行状态压缩, 0代表这种颜色已经全部都聚集在一起并且 所有原创 2015-09-09 14:12:54 · 641 阅读 · 0 评论 -
Zoj 3647 Gao the Grid (数论?)
给你n * m 的的矩形方格, 也即有(n + 1) * (m + 1) 个点, 然后问可以找到做少个三角形。n比较大显然是不能暴力枚举的, 然后想dp递推也发现太复杂了,,于是想逆向求解,比赛的时候想的是枚举斜率, 然后判断当前斜率下右多少点共线, 再考虑平移, 可是还是不对,,跟ac代码比了很多样例都是没问题的。。醉了。然后Ac代码的解题方式是, 枚举每条直线的一个端点, 另一个端原创 2015-09-09 23:46:26 · 457 阅读 · 0 评论 -
ACDream dp专题 C - 哗啦啦村的扩建
中文题反而更容易让人误解,,所谓每条路的左边x个房子右边y个房子。。其实就是每条路的一端的房子数和另一端的房子数。然后按题目的公式算。树形dp一个dfs就可以解决了, 求出每条路的一端连上了多少个房子, 另一端显然就是n减掉这一端的,坑就坑在题意了吧,,题目不难。当然坑点也是有的,,万万分之一也就是说结果要乘1e8, 可是结果是0的时候又只能输出0。#include #include原创 2015-09-09 13:18:21 · 450 阅读 · 0 评论 -
ACDream dp专题 B - 喵哈哈村的挑衅
中文题不解释。区间dp裸题吧,,是两断区间所以要记录两个l,r, dp[l1][r1][l2][r2]记录当前状态下先手取能得到的最大值, 从整个区间递推到底就行了。#include #include #include #include #include #include #include #include #include #include #include #in原创 2015-09-09 13:31:25 · 488 阅读 · 0 评论 -
LightOj 1186 Incredible Chess nim游戏
不知道这题放出来算不算凑数Orz;题目大意就是 棋盘上每一纵列有黑白两个棋子, 黑色一定在白色上方,两个人一人各执一色, 白色先走,每次操作可以把自己的颜色向上或者向下移动任意格, 但是不能超出范围也不能越过另一色的棋, 无法操作的一方败。移到比较经典的nim游戏题。。每一纵列黑白棋之间的空格数作为这一堆的石子数然后全部异或就行。。结果为0就先手败否者先手胜。 详细证明请移步:htt原创 2015-09-09 14:24:07 · 545 阅读 · 0 评论 -
Hdu 1025 Constructing Roads In JGShining's Kingdom 最大上升子序列nlogn算法
题目大意:两条线上各有n个点, 第一条线上每个点要跟另一条线上某个点连边, 然而由于边不能交叉所以很多边不能连上, 问你最多能连上多少条边。这题就是比较难看出来。。其实读入的时候读进去一对对u, v, 相当于就是a[u] = v;然后从a[1] ~ a[n]中选出一些数, 这些数必须是递增的因为这样才能保证没有交叉, 于是就变成了 LIS。。比较神奇, 但是代码很简单, 难在想出算法, 多理一原创 2015-09-09 15:03:32 · 315 阅读 · 0 评论 -
Uva 12549 Sentry Robots 网络流 - 二分图匹配
题目大意见紫书P381。 这道题是比较明显的二分图建模吧, 这类题的建模思维很常见, 对于每个点, 对应的横纵坐标只需要选一个点, 那么将横纵坐标看作在二分图两边的两个点然后连边即可, 只是这题有障碍物所以不能单纯的按上面提到的横纵坐标来, 要经过处理。#include #include #include #include #include #include #includ原创 2015-09-09 22:59:55 · 1026 阅读 · 0 评论 -
Uva 1312 Cricket Filed 枚举
题目大意见紫书P256。直接枚举就好,,把树按y值排序, 然后两棵树的y值差, 再枚举x轴两个边界和树的x坐标, 去两个方向的最小值就是当前找到的合法正方形的最大值, 然后再跟ans取max即可, 当然排序枚举也可以按x来, 没差。我的代码离散化了 但是不离散化听说也过。#include #include #include #include #include #include原创 2015-09-09 13:14:17 · 424 阅读 · 0 评论 -
FZU 2156 Climb Stairs
题目大意: 你要从0层开始, 经过A, 和B层, 到达N层, 每次可以走x或者y层, 输出方法数。比较简单的dp了吧。。只是处理方式稍微机智点(虽然还是比较好想到的), 递推方程dp[i] = dp[i - x] + dp[i - y],然后输出dp[A] + dp[B - A] + dp[N - B],(事先swap保证A #include #include #include #inc原创 2015-09-10 00:22:27 · 473 阅读 · 0 评论 -
Uva 1617-Laptop (贪心?)
题意见紫书P255。一开始度错题以为让你输出最小的间隔大小, 冥思苦想不知道怎么办后来才知道原来是问的求间隔的个数,,于是感觉就可做了。先把区间按左值升序排序, 左值相同右值升序。 一开始放的时候 ,放在区间的最右端,用一个right 记录当前线段的右端点放的坐标, 这样才能让下一段有机会能更这一段挨在一起, 不产生间隙, 假如下一个放在最左边也无法跟前一个接触, 那么这里间隙就肯定要+原创 2015-09-09 12:57:17 · 551 阅读 · 0 评论 -
Uva 10622 Perfect Pth Power 唯一分解定理
题意见紫书P343.既然要是b的p次方, 很容易就能想到唯一分解然后每个质因数的次数的gcd, 可是一直无脑wa真是快崩溃了。。瓦擦擦然后看了别人代码才知道原来还可以是负数。。。真是【哔---】了- -, 然后负数变成整数再分解再gcd, 这里就要注意次幂不能是偶数,所以while(!(ans & 1)) ans >>= 1;#include #include #include原创 2015-09-09 15:12:21 · 486 阅读 · 0 评论 -
Zoj 3646 Matrix Transformer 二分图完美匹配
题目大意:给你一个n * n 的二维图, 每个点都有一个方向, 上或者下, 用U和D表示, 蓝厚问你交换任意次整行后, 能不能让主对角线上全部都是U。第一眼一看, 水题啊贪心搞一搞就行了啊,然后写到一半发现并不能随意水过去, 情况太多了Orz, 然后就想,难道是网络流,,当时一直以为有更简单的解法可是赶时间懒得想就直接dinic上去干了,,后来发现这题真是网络流, 每个U点的行和列对应点连边,原创 2015-09-09 23:02:48 · 323 阅读 · 0 评论 -
LightOj 1018 Brush (IV) 状压dp
题目大意: 有n个灰尘, 给出坐标, 吸尘器每次可以清理一条线上的全部灰尘, 问最少需要画几条线将全部灰尘覆盖。一开始理解错题意了以为下一次画线的起点必须是上一次的终点Orz 后来发现每一次都可以随意确定起点终点。 所以直接就更简单了, 01代表这个灰尘是否还存在。由于画线是任意的, 所以可以随意取一个点 然后枚举另一个点然后用这两个点画线(这里的随意具体到代码就是找到该状态的第一个1)原创 2015-09-09 14:33:39 · 409 阅读 · 0 评论 -
Uva 1632 alibaba 区间dp
题意见紫书P306。这道题跟例题的修长城比较像, 也是用三维dp记录一个区间i, j , Alibaba在左端点或者右端点的时候的最短时间, 那么转移方程就是:dp[i][j][0] = min(dp[i + 1][j][0] + a[i + 1] - a[i], dp[i + 1][j][1] + a[j] - a[i]);dp[i][j][1] = min(dp[i][j - 1]原创 2015-09-09 13:45:50 · 413 阅读 · 0 评论 -
Uva-12166-Equilibrium Mobile(逆向思维, map)
题目大意:给定一颗最大深度为16的二叉树,代表一个天平, 叶节点是一些秤砣,每根杆都悬挂在中间,秤砣重量已知,问最少要修改多少个秤砣的重量才能使天平平衡。刚看到这道题的时候就发现 - -、 从正面想这道题几乎是无解, 对于一个不平衡的天平根本不知道要改哪边,甚至。。就算是平衡了的天平你也无法确定改不改重量,冥思苦想无所得之后请教他人,发现这题是逆向解Orz,瞬间明白过来了。对于每个秤砣,原创 2015-09-08 20:23:02 · 387 阅读 · 0 评论 -
Hdu 1978 How many ways 二维dp水题。。
嗯题目是中文多琢磨就懂了就不解释了。我只是来水一发题解。。 直接两层循环, 遍历每个点然后对于每个点将从这个点出发可达的每个点的方法数都再加上这个点的方法数,随便水一水就过了。。#include #include #include #include #include #include #include #include #include #include #inc原创 2015-09-09 14:58:50 · 393 阅读 · 0 评论 -
HDU 3986 Harry Potter and the Final Battle 最短路
题目大意: 给你一个无向图, 蓝厚让你删掉一条边, 让剩下的图中的最短路 最长, maxmin系列。。一开始想不出来解法, 就准备暴力一发试试, 也就是找到最短路之后一条条拆边, 然后不出意外的T了, 以为有什么厉害的算法, 结果赛后发现- -只因为删边的时候没加if( ans == inf) break; 这一句, 啊啊啊居然卡这种数据我也是醉了, 然后就噩梦#include "iost原创 2015-09-09 23:29:34 · 393 阅读 · 0 评论 -
Zoj 3761 Easy billiards dfs
在桌面上给你一些球, 你可以选择击任意一个球, 向4个方向, 但是要求是球运动过程中必须能装上另一个球, 也即至少在这个方向上还存在一个球。然后撞上一个球后,之前的一个球停在碰撞处, 被碰撞的求继续按撞他的球的方向运动直到离开桌面,然后问你桌面上最少能存在几个球, 输出击球顺序(坐标,方向)。比赛的时候我的思路是吧能撞到的求连边然后从入度为0的点去撞其它球, 如果有环的话就随便撞一个就是了,原创 2015-09-09 23:54:15 · 390 阅读 · 0 评论 -
ZOJ 3735 Josephina and RPG 概率dp水题。
题目大意: 现在有n个角色, 3个玩家用不同的角色来组队刷本, 也就是有C(n,3)种组合方式, 题目给出了这些组合方式之间对战的胜率, 然后每过一关你有一个选择:继续以当前配置进入下一关, 或者用这一关的敌人的配置进入下一关。求最后通关的最大胜率,。保留6位小数。就是一个概率dp, 弱用了记忆化搜索来写, dp[i][j]记录第i关用配置j的最大, 递推方程也挺好写, 见代码:#incl原创 2015-09-10 00:30:55 · 367 阅读 · 0 评论 -
Uva 307 Sticks(IDA*)
这道题题意还是好理解就不多少了,,详见紫书P218。应该属于比较明显的IDA*了, 枚举原始木棍的长度, 从max a[i]开始,如果同时总长度mod当前长度不为0也跳过, 比较基础的剪枝。另外一个比较重要的剪枝是, 先把小木棍降序排序, 从大往小拼, 凑木棍的时候,如果用到了长度为d的木棍,那么接下来就只用枚举长度d的木棍已枚举过了。#include #include #include原创 2015-09-09 11:30:30 · 395 阅读 · 0 评论 -
Uva 177 Paper Folding(模拟?Orz)
题意:一张纸(其实理解成一条线可能更好理解一点) 经过n次对折后, 会产生很多方向不同的折痕, 然后要输出按折痕打开后的形状。一看到这道题的输出就傻了,,用‘|’和‘_'画图真是简直了。。然后仔细研究一会会发现,n每次加一就是将n - 1的图以最后一个点为基准顺时针旋转90度。然后模拟一下从起点开始画图的过程中每条边的走势,转弯方向,分析后会发现一共8中情况:上左, 上右, 右上, 右下, 下原创 2015-09-09 12:28:06 · 575 阅读 · 0 评论 -
HDU 4941 Magical Forest 离散化
题意: 一个n * m 的图, 某些点有苹果,每个苹果有价值, 然后现在交换某些行或者列, 或者查询某个点的苹果的价值(没有苹果就是0)。还是比较好想的。。x[],y[]数组存当前状态下的各行各列存的是初始时的哪一行哪一列,交换的时候交换值就行了, 可能复杂就在离散化吧,不过实际上用map离散化也挺easy的样子。。虽然我用的最传统的vector、sort、 unique、resize然后up原创 2015-09-10 00:25:35 · 411 阅读 · 0 评论 -
Uva1600 - Patrol Robot(bfs解法)
题目大意:一个机器人要从左上角(1,1) 走到右下角(m, n) (当然读入m,n的时候因为习惯我反过来了),然后路上有障碍物, 但是机器人每次可以连续穿过最多k个障碍物——是每次,不是累计的,刷这题的时候好几个人同学理解错题意挂在这了。然后问所需要的最短时间。看完这题第一反应就是bfs。。然后再考虑穿过障碍物的情况,由于地图较小(1 话不多说见代码:#include #includ原创 2015-09-08 18:57:05 · 639 阅读 · 0 评论 -
Uva-806 Spatial Structures
题目大意: 一个n * n(n <= 64) 的正方形网格可以映射成一颗四叉树, 根节点对应整个区域。如果当前点对应的区域全为黑格子或者白色格子,就没有子节点,节点颜色即为格子颜色, (当然题目中黑色是1白色是0), 有黑有白就是灰色并且有4个子节点分别对应4个边长一半的正方形区域,由此形成一颗四叉树,然后 每个从每个子节点出发回到根的路径(每个节点的4个4节点的边编号为1,2,3,4), 看做一原创 2015-09-08 22:55:36 · 1049 阅读 · 0 评论 -
Uva 11882 Biggest Number (IDA*)
题目大意见紫书218。一看到这道题第一反应就是dfs,然后第二反应就是单纯的dfs会T。。于是就考虑迭代加深。首先预处理, 找到每个连通块的大小以及编号, maxd为当前寻找的数的位数,从1开始到最大连通块大小,于是对于障碍物 或者所在连通块大小小于maxd的数字格就不需要枚举了, 另外已经得到的数字如果已经小于的当前ans, 就直接return不需要继续找。#include #in原创 2015-09-09 12:12:01 · 457 阅读 · 0 评论 -
HDU 3951 Coin Game 博弈论
题目大意: 给你n个硬币围成一圈, 两人轮流拿连续的硬币, 拿的个数不能大于k个, 另外只能拿连续的,中间有间隔就不能拿。这题其实挑战上有一道类似的,,比赛的时候想了个思路感觉可以然后写了写一不小心就过了Orz, 首先说特殊情况, k = 1 的时候只能一人一次拿一个也就是说输赢看奇偶, 然后n k 的时候后手必胜这个当时真真是不敢交。。思路其实挺好理解, 先手拿了几颗后, 后手在对面拿,原创 2015-09-09 23:16:42 · 441 阅读 · 0 评论