省常中模拟 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] ...
随机推荐
- 【HDOJ】【4405】Aeroplane chess飞行棋
概率DP/数学期望 kuangbin总结中的第4题 啊还是求期望嘛……(话说Aeroplane chess这个翻译怎么有种chinglish的赶脚……) 好像有点感觉了…… 首先不考虑直飞的情况: f ...
- 【BZOJ】【2693】JZPTAB
莫比乌斯反演 PoPoQQQ讲义第5题,是BZOJ 2154的升级版(多次询问) 题解:http://blog.csdn.net/popoqqq/article/details/42078725 WA ...
- 如何使用工具进行线上 PHP 性能追踪及分析?
工作了一两年的 PHPer 大概都多多少少知道一些性能分析的工具,比如 Xdebug.xhprof.New Relic .OneAPM.使用基于 Xdebug 进行 PHP 的性能分析,对于本地开发环 ...
- hdu 2736 Surprising Strings(类似哈希,字符串处理)
重点在判重的方法,嘻嘻 题目 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> int ...
- PSYoungGen /PSOldGen/PSPermGen区别
原文地址:http://bbs.csdn.net/topics/210064791 谁能解译一下PSYoungGen /PSOldGen/PSPermGen区别及出现的问题? 看来没有收集到答案,查看 ...
- Perl 三种时间time,localtime,gmttime
#!/usr/bin/perl use warnings; use diagnostics; use strict; use POSIX; print "time: ", time ...
- BZOJ 3203 sdoi 2013 保护出题人
由于样例解释很清晰,所以很容易得到以下结论: 1.每一关都是独立的,且僵尸的相对位置不会变 2.每一关的攻击力=Max(sum(i)/dis(i)) 其实sum(i)是僵尸攻击力的前缀和,dis(i) ...
- 应用程序出现挂死,.NET Runtime at IP 791F7E06 (79140000) with exit code 80131506.
工具出现挂死问题 1.问题描述 工具出现挂死问题,巡检IIS发现以下异常日志 现网系统日志: 事件类型: 错误 事件来源: .NET Runtime 描述: Application: Di ...
- Java学习笔记之:Java简介
一.引言 Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计语言和Java平台的总称.由James Gosling和同事们共同研发,并在1995年正式推出. ...
- AsyncTask 与 Thread+Handler
AsyncTask是封装好的线程池,比起Thread+Handler的方式,AsyncTask在操作UI线程上更方便,因为onPreExecute().onPostExecute()及更新UI方法on ...