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的更多相关文章

  1. 省常中模拟 Test3 Day2

    matrix 找规律 题意:给定一个 N*N 的只有 0 和 1 的矩阵,有 Q 个操作,分三种:1. 将某行上的所有数字取反:2. 将某列上的所有数字取反:3. 输出 sum{ a[i][j]*a[ ...

  2. 省常中模拟 Test1 Day1

    临洮巨人 排序 题意:在字符串中找出 A.B.C 三个字母出现次数相同的区间个数. 初步的解法是前缀和,用 a(i), b(i), c(i) 表示在位置 i 之前(包括 i)各有 字母 A.B.C 多 ...

  3. 省常中模拟 day1

    第一题: 题目大意: 给出N个数的数列,如果相邻的两个数加起来是偶数,那么就可以把这两个数消掉,求最多能消掉多少数. 解题过程: 1.先自己手工模拟了几组数据,发现不管消除的顺序如何,最终剩下的是一定 ...

  4. 省常中模拟 Test2 Day2

    two 模拟 大意:给你一个 N 位二进制数,有四种操作:加1.减1.乘2.整除2.给定一个操作序列,求最终结果.N <= 5*10^6.数据保证不会在最高位上进行进位或退位操作. 初步解法:由 ...

  5. 省常中模拟 day2

    第一题: 题目大意: 有mn颗糖,要装进k个盒子里,使得既可以平均分给n个人,也可以平均分给m个人. 求k的最小值. 解题过程: 1.先看一组小数据(13,21).那么根据贪心的原则很容易想到先拿13 ...

  6. 省常中模拟 Test4

    prime 数论 题意:分别求 1*n.2*n.3*n.... n*n 关于模 p 的逆元.p 是质数,n < p. 初步解法:暴力枚举.因为 a 关于模 p 的逆元 b 满足 ab mod p ...

  7. 全国信息学奥林匹克联赛 ( NOIP2014) 复赛 模拟题 Day1 长乐一中

    题目名称 正确答案  序列问题 长途旅行 英文名称 answer sequence travel 输入文件名 answer.in sequence.in travel.in 输出文件名 answer. ...

  8. 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题, ...

  9. 10.17(山东多校联合模拟赛 day1)

    山东多校联合模拟赛 day1 题不难 rect [问题描述] 给出圆周上的 N 个点, 请你计算出以这些点中的任意四个为四个角,能构成多少个矩形. 点的坐标是这样描述的, 给定一个数组 v[1..N] ...

随机推荐

  1. Java多线程——<三>简单的线程执行:Executor

    一.概述 按照<Java多线程——<一><二>>中所讲,我们要使用线程,目前都是显示的声明Thread,并调用其start()方法.多线程并行,明显我们需要声明多个 ...

  2. Java多线程——<二>将任务交给线程,线程声明及启动

    一.任务和线程 <thinking in java>中专门有一小节中对线程和任务两个概念进行了具体的区分,这也恰好说明任务和线程是有区别的. 正如前文所提到的,任务只是一段代码,一段要达成 ...

  3. [转载]C# winform登陆框验证码的实现

    验证码技术已愈来愈成熟,从最初的数字.字母.字符.汉字已经到目前的语言,其应用也甚广,之前大多数只有在网站上可以看到,现在在一些客户端软件也经常可见(比如证券相关软件).之前做的一个基于 C# 客户端 ...

  4. C#textbox右击弹出菜单

    给窗口体拖一个contextMenuTrip 控件,也就是右键菜单控件,这时你就不要给这个控件写内容了, 选中textBox 然后点属性窗口,把它的contextMenuTrip 属性选中你刚才托的那 ...

  5. Codeforces Round #241 (Div. 2)->A. Guess a number!

    A. Guess a number! time limit per test 1 second memory limit per test 256 megabytes input standard i ...

  6. linux源代码阅读笔记 free_page_tables()分析

    /* 77 * This function frees a continuos block of page tables, as needed 78 * by 'exit()'. As does co ...

  7. How do you design object oriented projects?

    what are things you do during the high level design phase (before you begin programming) to determin ...

  8. 224. Basic Calculator

    题目: Implement a basic calculator to evaluate a simple expression string. The expression string may c ...

  9. 转:在MyEclipse+Hibernate

    源地址http://blog.renren.com/share/270733118/5528463779 1.实验环境准备 MyEclipse8.6 Tomcat6.0.20 MySQL5.1 ...

  10. JNI读取assets资源文件

    源自:http://www.rosoo.net/a/201112/15459.html assets目录底下的文件会被打包到一个apk文件里,这些资源在安装时他们并没被解压,使用时是直接从apk中读取 ...