省常中模拟 Test3 Day1
tile
贪心
题意:给出一个矩形,用不同字母代表的正方形填充,要求相邻的方块字母不能相同,求字典序(将所有行拼接起来)最小的方案。
初步解法:一开始没怎么想,以为策略是每次填充一个尽量大的正方形。但是很快就能找到反例。比如当一个 4*2 的矩形左半部分填充了一个 2*2 的 A 后,不应该在右半部分填充 2*2 的 B,而是应该先填一个 1*1 的 B,然后继续用 A 填充,如图。
上面这个例子中,第二种方案虽然用到了 C,但是如果按照题意将每一行拼接起来之后第二种方案的字典序显然更小。
正解:从上面的反例中我们可以看出,不用考虑整体,按每行每列的顺序考虑每个格子即可。比如左上角第 1 个格子 (1, 1),1*1 的 A 无疑是最优解,然后看能否扩展,发现可以扩展到2*2 的 A,所以就进行填充。然后到了 A 右边第一个格子 (1, 3),显然应该填 1*1 的 B,然后看能否扩展,格子 (1, 4) 是可以用 A 填充的,所以 (1, 3) 的 B 就不扩展。只要按行的顺序来考虑每个格子就能保证字典序最小。
path
最短路
题意:求一个无向图中任意两点间所有可能的最短路的边数之和。
初步解法:很明显先用 Floyd 求出两点间最短路。然后我的做法是做一个 O(N^3) 的递推。用 f(i, j) 表示从 i 到 j 的最短路一共有多少边数。f(i, j) = sum{ f(i, k), (k, j) ∈E且dist(i, k)+g(k, j)=dist(i, j) },边界条件是 f(i, i) = 1。但是这种方法能找到反例,如下图:
假设图中 (1 -> 3) 和 (1 -> 4) 都是 1 到某个点的最短路的一部分,那么 f(2, 2) = 1 就会在最终结果中被累计两次,而实际上是同一条边,所以会导致答案偏大。
正解:先了解「最短路图」的概念。对于任意的点对 (i, j),将在从 i 到 j 的最短路中出现过的点与边加入到从 i 到 j 的最短路图中。很明显,最短路图中的点满足 dist(i, k)+dist(k, j)=dist(i, j) 的条件。则 i 到 j 的所有最短路的总边数等于最短路图中每个顶点的入度。具体的程序实现中不必构造这样的最短路图,只要判断顶点是否满足上述条件,然后统计其入度即可。
tower
并查集
大意:以矩阵的形式给出一个圆柱体的侧面,现在要在其中加入障碍点,对于一个障碍点判断其是否能加入的条件是:加入该障碍点后从下往上依然存在一条四连通的路径。注意是圆柱体的侧面,所以虽然以矩阵形式给出但不存在实际上的左右边界,即从矩阵的最右边可以往右走到矩阵的最左边。
初步解法:每次假设将障碍点加入,然后对于底部的点做 DFS 判断是否存在从底部到顶部的四连通路径。据说如果优化得足够好也是能够 AC 的。
正解:对于判断连通的问题自然而然地会想到并查集。但是这一题中空格子的数目在不断减少,而并查集的元素删除并不容易,所以需要进行巧妙的转化。为了处理方便,我们可以先把整个矩形完整地复制一遍,将两个矩形并列。每次加点都将其加到两个矩阵中。如果一个点与它在另一个矩阵中的「复制」点之间通过其他的障碍点共同形成了一个八连通块,就必然能够将整个圆柱体侧面堵住。自己画一下就知道是对的。由于矩阵中的障碍点是不断增加的,所以用并查集处理就会比较简单。不过关于判断连通还是需要一定技巧。我一开始的想法先将这个点加入,那么就将其与周边的八个点在并查集中合并。但是如果判断出的结果是这个点不能加入,那么就很难将并查集恢复到原状。然后的想法是枚举两个矩阵中目前处理的点四周的八个点(为什么只需要判断这八个点?因为如果将目前的点加入,那么它必然会和旁边这八个点形成同一个八连通块),判断其两两是否在同一集合中,这样需要 64 次判断。而更优的方法是用哈希表,在左边的矩阵中将目前处理的点旁边的八个点 hash(具体方法是 hash[find_set(i)] = xxx),然后在右边也进行 hash,如果在右边处理时发生了冲突就说明如果加入这个点必然会形成一条横跨整个圆柱体侧面的八连通块。一个提示:如果每次处理一个点都将 hash 数组初始化为 0,时间耗费是很大的。所以可以用这样一个优化:将 hash 值赋为当前处理的点的编号(即循环变量 i)。这样每次的 hash 都不会被上一次遗留的 hash 值影响,省去了重置 hash 的时间。
省常中模拟 Test3 Day1的更多相关文章
- 省常中模拟 Test3 Day2
matrix 找规律 题意:给定一个 N*N 的只有 0 和 1 的矩阵,有 Q 个操作,分三种:1. 将某行上的所有数字取反:2. 将某列上的所有数字取反:3. 输出 sum{ a[i][j]*a[ ...
- 省常中模拟 Test1 Day1
临洮巨人 排序 题意:在字符串中找出 A.B.C 三个字母出现次数相同的区间个数. 初步的解法是前缀和,用 a(i), b(i), c(i) 表示在位置 i 之前(包括 i)各有 字母 A.B.C 多 ...
- 省常中模拟 day1
第一题: 题目大意: 给出N个数的数列,如果相邻的两个数加起来是偶数,那么就可以把这两个数消掉,求最多能消掉多少数. 解题过程: 1.先自己手工模拟了几组数据,发现不管消除的顺序如何,最终剩下的是一定 ...
- 省常中模拟 Test2 Day2
two 模拟 大意:给你一个 N 位二进制数,有四种操作:加1.减1.乘2.整除2.给定一个操作序列,求最终结果.N <= 5*10^6.数据保证不会在最高位上进行进位或退位操作. 初步解法:由 ...
- 省常中模拟 day2
第一题: 题目大意: 有mn颗糖,要装进k个盒子里,使得既可以平均分给n个人,也可以平均分给m个人. 求k的最小值. 解题过程: 1.先看一组小数据(13,21).那么根据贪心的原则很容易想到先拿13 ...
- 省常中模拟 Test4
prime 数论 题意:分别求 1*n.2*n.3*n.... n*n 关于模 p 的逆元.p 是质数,n < p. 初步解法:暴力枚举.因为 a 关于模 p 的逆元 b 满足 ab mod p ...
- 全国信息学奥林匹克联赛 ( NOIP2014) 复赛 模拟题 Day1 长乐一中
题目名称 正确答案 序列问题 长途旅行 英文名称 answer sequence travel 输入文件名 answer.in sequence.in travel.in 输出文件名 answer. ...
- CH Round #54 - Streaming #5 (NOIP模拟赛Day1)
A.珠 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2354%20-%20Streaming%20%235%20(NOIP模拟赛Day1)/珠 题解:sb题, ...
- 10.17(山东多校联合模拟赛 day1)
山东多校联合模拟赛 day1 题不难 rect [问题描述] 给出圆周上的 N 个点, 请你计算出以这些点中的任意四个为四个角,能构成多少个矩形. 点的坐标是这样描述的, 给定一个数组 v[1..N] ...
随机推荐
- 剑指offer--面试题10
题目:求整数二进制表示中1的个数. 分析:此题直接考查二进制表示与位运算!!! 正数和负数的二进制表示不同!在计算机中,正数的二进制表示即为通常所写的二进制:而负数的二进制表示则用补码表示,即原码的反 ...
- 【转载】错误 CS0016: 未能写入输出文件“c:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/Temporary ASP.NET Files/.........dll”--“拒绝访问。 ”
win7中安装asp.net的问题 编译器错误信息: CS0016: 未能写入输出文件问题解决办法 编译错误 说明: 在编译向该请求提供服务所需资源的过程中出现错误.请检查下列特定错误详细信息并适当地 ...
- NOI 国家集训队论文集
鉴于大家都在找这些神牛的论文.我就转载了这篇论文合集 国家集训队论文分类 组合数学 计数与统计 2001 - 符文杰:<Pólya原理及其应用> 2003 - 许智磊:<浅谈补集转化 ...
- css ul li 制作导航条
<html> <head> <style> .test ul{list-style:none;} .test li{float:left; width:100px; ...
- POJ 1258 Agri-Net(最小生成树,模板题)
用的是prim算法. 我用vector数组,每次求最小的dis时,不需要遍历所有的点,只需要遍历之前加入到vector数组中的点(即dis[v]!=INF的点).但其实时间也差不多,和遍历所有的点的方 ...
- 能量项链//区间DP
P1056 能量项链 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 NOIP2006 提高组 第一道 描述 在Mars星球上,每个Mars人都随身佩 ...
- lintcode :Ugly Numbers 丑数
题目 丑数 设计一个算法,找出只含素因子3,5,7 的第 k 大的数. 符合条件的数如:3,5,7,9,15...... 样例 如果k=4, 返回 9 挑战 要求时间复杂度为O(nlogn)或者O(n ...
- 是什么让 Ubuntu 选用 Qt 而不是 GTK?
是什么让 Ubuntu 选用 Qt 而不是 GTK? 一个正在发生的事实,Ubuntu正在不断Qt化!我曾一直在抱怨的Software Center,今日一看源码,竟然有softwarecenter/ ...
- Windows下获取高精度时间注意事项
Windows下获取高精度时间注意事项 [转贴 AdamWu] 花了很长时间才得到的经验,与大家分享. 1. RDTSC - 粒度: 纳秒级 不推荐优势: 几乎是能够获得最细粒度的计数器抛弃理由: ...
- 58. Length of Last Word
题目: Given a string s consists of upper/lower-case alphabets and empty space characters ' ', return t ...