1、Copyright 我是智障1骗 分 导 论I N T R O D U C T I O N T O C H E A T I N G I N N O I P关于应付竞赛不会难题的策略我是智障大牛是稀有的,每道题都会的大牛更少。相信想我这样的人还是挺多的,那竞赛时遇到不会的难题怎么办呢?放弃?让100 分就这样流去?当然不能放弃。目录1 、心态2 、非完美算法3 、精彩的骗4 、简单数学分析猜测5 、分类讨论6 、实战训练7 、总结Copyright 我是智障2【1 】遇到难题时心态要稳定,先搞定简单的题目,最后思考难题。心态是第一位。【2 】如果难题实在不能解决也不能放弃,虽然写不出完美的算法,
2、但可以用象贪心,搜索之类的算法,虽然不能A C 但一般能过几个,有分总比没分好。举个例子穿越磁场(c r oss )探险机器人在Samuel 星球上寻找一块奇特的矿石,然而此时它陷入了一片神秘的磁场区域,动弹不得。探险空间站立刻扫描了这片区域,绘制出该区域的磁场分布平面图。这片区域中分布了N 个磁场,每个磁场呈正方形,且边与坐标轴平行。例如下图中,存在3 个磁场,白点表示机器人的位置,黑点表示矿石的位置:科学家们分析平面图,进一步发现:这些磁场为大小不一的正方形,可能相交,甚至覆盖,但是它们的边缘不会重合,顶点也不会重合。例如下面的两种情形是不会出现的:科学家们给探险机器人启动了磁力罩,这样它
3、就可以在磁场中自由穿越了。初始时,探险机器人和所有矿石都不在任何磁场的边缘。由于技术限制,XYOCopyright 我是智障3在穿越过程中机器人只能够水平或垂直移动,且不能够沿着磁场的边缘行动。由于磁力罩的能量有限,科学家们希望探险机器人穿越尽量少的磁场边缘采集到这块矿石。例如上图中,探险机器人最少需要穿越两次磁场边缘。现在小联请你编写程序,帮助科学家们设计探险机器人的路线,统计探险机器人最少需要穿越多少次磁场边缘。输入(CROSS.IN):第一行有一个整数N,表示有N 个磁场(1 m a p i , 1 )a nd ( s ym a p i , 2 ) )Copyright 我是智障4xor
4、 ( ( t xm a p i , 1 ) a nd ( t ym a p i , 2 ) )t hen i nc( t ot a l ) 很短,但数据太弱了,没有一个有如上可能。所以我全过了这样是很划算的,如果当时放弃就一分都没有了。附标准算法(2006全国冬令营汪晔):(有点复杂,当时我绝对想不出来。) 问题分析:方法1 :将坐标中的所有整点坐标当作顶点,在每个点与坐标系中相邻的点间加一条无向边,如果穿过磁场,边的权值为1 ,否则权值为0 。求机器人从起点到终点的最小耗费,也就是求构造的图中两点之间的最短路径,我们可以用D i j kst r a 解决。每次循环中寻找最大值的复杂度为O (
5、 V ) ,改进相邻点时由于要判断是否穿过磁场边,所以复杂度为O ( N ) 。整个算法复杂度为就是O ( V N + V2 ) ,这里V = 整个坐标中的点的个数= 10000*10000,显然超时。当然,在实现过程中我们可以有所优化,比如确定查找点的范围。方法2 :D i j kst r a 分为两大部分,第一部分是取所有未标记点中的最小值,第二部分是用当前最小值改进整个图。那么建立一个上小下大的堆,堆中保存所有起始点到图中未标记的点的最0 0 01 0 10 0 01 0 1000101101000O xy0 00 0001 11011 11 100000 0 0 0 000 00 00
6、10112 2Copyright 我是智障5短路径值,这样每次取出一个最小值的复杂度为O ( 1);由于此图中,每个点的度最多为4 ,查找边的权值的复杂度为 O ( N ) ,更新堆的复杂度为 O ( V l og2 V ) 。因而算法复杂度降为O ( V + N V + V l og2 V ) 。但由于V = 10000*10000仍不能在时限中出解。方法3 :此题的数据规模有一些特性虽然坐标系的范围巨大,但有效坐标(机器人的坐标,宝藏的坐标和磁场顶点坐标)的个数却很小。上两个方法的主要复杂度都取决于V ,也就是坐标系中的点数。如果我们可以把坐标系的范围缩小,也就相当于把V 缩小,就可以大大
7、降低问题的时间复杂度。在上种方法的构图中,我们会发现很多边的权值为0 ,也就是说,可能有很多连续点的最短路径值都相等。如图:那么我们将整个图中有效坐标抽出,建立一个新的坐标系,这个坐标系中相邻两个个坐标的间距为单位“1 ”,但此时单位长度的意义为有效坐标的序号。如图:这 样 我 们 依 然 用 最 短 路 径 的 方 法 在 这 个 图 中 进 行 操 作 , 算 法 复 杂 度 为O ( V + V N + V l og2 V ) ,但此时,V = 204*204,问题得以解决。方法4 :离散化后对整个图中的连续无磁场部分进行染色,如下图:问题就是求机器人所在点的颜色区域到宝藏所在点的颜色区
8、域的最短路径。由于每相邻两个区域间的边的权值均为1 ,所以算法复杂度为O ( V ) 。因而整个算法的复杂度为O ( N V ) 。这里的N = 100,V = 204*204。如果先构图,复杂度为O ( N ) ,再染色用宽搜求最短路复杂度为O ( V ) ,所以总复杂VO xy0 00 0000 00000 00 000000 0 0 0 000 00 00000 000Copyright 我是智障6度为O ( N + V ) 。V【3 】如果太难了,连一点思路都没有可以考虑只输出一个值,如果对了也有10 分。但这个值也不能乱输出,也要有一定的依据,输样例的成功率太小了(noip2004除
9、外)如果题目要求误解输出“ N o“之类的,输出这个肯定有分。如 noip2005第三题,输出1有 10 分。千万不要小看这10 分,当时一等才130,很多人120郁闷了吧要输出可能性最大的,骗要骗得精彩。如果天上能掉下来馅儿饼,那我就不用再学习了,天上能掉馅儿饼么?不能,所以我还得学习;如果天上能掉下来林妹妹,那我就不愁女友了,天上能掉林妹妹么?不能,所以我还得愁女友;如果天上能掉恐龙,那我就要时刻做好逃命的准备,天上能掉恐龙么?不能,所以我不用时刻做好逃命的准备;如果c hea t 能过很多数据是一种错,那我宁愿一错再错,c hea t 能过很多数据么?可以,所以,是的,我宁愿一错再错重建
10、道路( r o a d s )【问题描述】一场可怕的地震后,人们用N 个牲口棚(1N 150编号1N)重建了农夫John的牧场。由于人们没有时间建设多余的道路,所以现在从一个牲口棚到另一个牲口棚的道路是惟一的。因此,牧场运输系统可以被构建成一棵树,John想要知道另一次地震会造成多严重的破坏。有些道路一旦被毁坏,就会使一棵含有P(1P N)个牲口棚的子树和剩余的牲口棚分离,John想知道这些道路的最小数目。【输入】第 1 行:2 个整数,N 和 P第 2 N 行:每行2 个整数I 和 J ,表示节点I 是节点J 的父节。【输出】单独一行,包含一旦被破坏将分离出恰含P 个节点的子树的道路的最小数
11、目。【样例输出】roadsin roads.out11 6 2Copyright 我是智障7l 2l 3l 41 52 62 72 84 94 104 11【样例解释】如果道路1 4 和 1 5 被破坏,含有节点(12 ,3 ,6 ,7 ,8)的子树将被分离出来。这道题也不是什么难题,但当时我就不知道怎么做。我用了垃圾的搜索,效率很低很低。为了检测我写的搜索是否正确,我随机生成了很多小数据(大的严重超时),一测发现结果怎么这么多2 ?难道2 的机率这么大?不管这么多了,反正我也想输样例了(样例也是2 ),于是心一恨写下了如下代码w r i t e l n( 2) 吃惊的是我的成绩,80 分啊(
12、数据太弱了)附标准算法:用树型动态规划求解。定义f ( n, m) 为在n 为根的子树中取m 个节点的最小代价,则状态转移方程为:f ( n, m) = m i nf ( n 0 , m0 ) + f ( n 1 , m1 ) + f ( n 2 , m2 ) + + f ( n k , mk ) 其中,n 0 , n 1 , n 2 , , n k 为 n 的 k 个儿子,m0 + m1 + m2 + + mk = m,并且定义f ( n i , 0 ) = 1 。最后的结果为:m i nf ( r oot, p ) , m i nf ( n, p ) | n r oot 看来w r i t
13、 e l n( 2)的性价比还是挺高的【4 】Copyright 我是智障8简单数学分析猜测座位的争执描述 Description文件名complain.pas;还记得Matrix67的“非常男女”计划吗?由Matrix67策划的学校大型男女配对活动将在大礼堂隆重举行,学校里许多人即将前来捧场。大礼堂一共有n 个座位,为了方便管理,Matrix67对它们从1 到 n 顺序编号。售票工作已经完成,经统计,共有k 个人拿到了入场券。由于kkt。第二行有k 个用空格隔开的正整数。这些正整数保证不超过t ,且所有不超过t 的正整数总会在这些数中出现至少一次。它们表示这k 个人的入场券上印的座位号。对于
14、30%的数据,n 3 0 0 t h e n w r i t e l n ( 1 )e l s e i f ( ( 3 0 0 a 1 ) d i v 1 0 0 ) Ti + 1 T K ( 1 a n + 1 ) t h e n c o n t i n u ee l s e l : = f a l s e i f ( n o t k ) a n d ( n o t l ) b r e a k e n d i f k o r l t h e n w r i t e l n ( 0 )e l s e w r i t e l n ( n d i v 2 ) e n d 得 3 0 分4 、虫食算
15、(noi p2004 p4 )( alpha.pas/ c / c pp)Copyright 我是智障15【问题描述】所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母。来看一个简单的例子:43#98650#45+ 8468#663344445506978其中# 号代表被虫子啃掉的数字。根据算式,我们很容易判断:第一行的两个数字分别是 5 和 3 ,第二行的数字是5 。现在,我们对问题做两个限制:首先,我们只考虑加法的虫食算。这里的加法是N 进制加法,算式中三个数都有 N 位,允许有前导的0 。其次,虫子把所有的数都啃光了,我们只知道哪些数字是相同的。我
16、们将相同的数字用相同的字母表示,不同的数字用不同的字母表示。如果这个算式是N 进制的,我们就取英文字母表中的前N 个大写字母来表示这个算式中的0 到 N 1 这 N 个不同的数字(但是这N个字母并不一定顺序地代表0 到 N 1 )。输入数据保证N 个字母分别至少出现一次。B A D C+ C B D AD C C C上面的算式是一个4 进制的算式。很显然,我们只要让A B C D 分别代表0123,便可以让这个式子成立了。你的任务是,对于给定的N 进制加法算式,求出N 个不同的字母分别代表的数字,使得该加法算式成立。输入数据保证有且仅有一组解。【输入文件】输入文件alpha.i n 包含4 行
17、。第一行有一个正整数N(N = m oney) t henbegi nk: = i br e a ke nde nd然后排序一次输出P r oce dure P r i nt var t : qwor dbegi nw r i t e l n( k) t : = 0f or i : = 1 t o k 1 doCopyright 我是智障18begi np i : = f i i nc( t , f i ) e ndp k : = m oney t s or t f or i : = 1 t o k dow r i t e ( p i , ) c l ose ( output) e nd这样做
18、简单,快捷,方便。最终由于数据弱得了80 分。6 、切割矩形( i nci se. pas) 题目描述把一个a*b矩形切割成尽量少的正方形。每次可以选择一个矩形,沿着水平或者垂直线把它切成两部分(不能转弯)。 输入 i ncise.in两个整数a, b(1=a,b=100) 输出 i ncise.out最少的正方形个数 样例输入5 6 样例输出5分析:一看就是dp,可是当时我怎么也没有想出来,于是用贪心做。每次在较长边上切去次长边。虽然这样连样例都过不了。但还是得30 分。Copyright 我是智障196 、 费解的开关(Mat r i x67 第一次模拟赛系列)描述 D e s c r i
19、 pt i on你玩过“拉灯”游戏吗?25 盏灯排成一个5x5的方形。每一个灯都有一个开关,游戏者可以改变它的状态。每一步,游戏者可以改变某一个灯的状态。游戏者改变一个灯的状态会产生连锁反应:和这个灯上下左右相邻的灯也要相应地改变其状态。我们用数字“1 ”表示一盏开着的灯,用数字“0 ”表示关着的灯。下面这种状态1011 1011011011 1100001 1011在改变了最左上角的灯的状态后将变成:011 1 11 1 1011011 1100001 1011再改变它正中间的灯后状态将变成:011 1 11 10011 1001101001 1011给定一些游戏的初始状态,编写程序判断游戏
20、者是否可能在6 步以内使所有的灯都变亮。输入格式I nputF or m a t第一行有一个正整数n ,代表数据中共有n 个待解决的游戏初始状态。以下若干行数据分为n 组,每组数据有5 行,每行5 个字符。每组数据描述了一个游戏的初始状态。各组数据间用一个空行分隔。对于30%的数据,n= 5 ;Copyright 我是智障20对于100%的数据,n= 500。输出格式O ut put F or m a t输出数据一共有n 行,每行有一个小于等于6 的整数,它表示对于输入数据中对应的游戏状态最少需要几步才能使所有灯变亮。对于某一个游戏初始状态,若6 步以内无法使所有灯变亮,请输出“ 1 ”。S
21、a m pl e I nput30011 101011100011 10101 1 1001 1 1011 1 1011 1 1 101 1 1 1 11 1 1 1 1011 1 11 1 1 1 11 1 1 1 11 1 1 1 11 1 1 1 1S a m pl e O ut put32 1 此题的方法由w i s e w i n 同学提供分析:当时还是不会(谁叫我是菜鸟呢),不是要达到目标状态吗?于是判断初始状态和目标状态有几个状态不一样,就输出几。最终得了40 分。7 、双素数( Pr i me. pas) 题目描述把所有素数排成一行:2, 3, 5, 7, 11, 13, 17
22、, 19, 23, .,Copyright 我是智障21把相邻两个素数“ 粘在一起“ 得到:23, 57, 1113,1719,2329,3137,.,取出的素数:23, 3137,.求该序列的第i(1=i=150)项. 输入 prime.in仅一个整数,i 输出 prime.out仅一个整数,序列的第i 项 样例输入12 样例输出13137 样例输入25 样例输出2167173分析:题很简单,朴素算法在看到题的同时也想出来了。可这个效率一看i 的范围才150,于是想到了交表C onstf : a r r a y 1. . 150of qwor d=(23,3137,8389,157163,167173,233239,/ / 省略大部分3751137517)最终得分100 分,而且速度巨快如雷电(O (1 )的算法)。Copyright 我是智障22Copyright 我是智障23写了这么多,都是些废话。会做才是硬道理。骗分的最高境界就是不骗分。作者:我是智障Q Q :195719555MS N : yuhaof a nghotm a i l . c omE m a i l : f a ngyuhaogma i l . c om