2015年新生趣味程序设计比赛题解
a+b
出题人:谢勇
题目类型:枚举
思路:
显然\(a\ge b\)无解。有解的情况下,先从\(a+1\)到\(\sqrt{b}\),枚举\(b\)的因子,如果存在第一个因子\(n\),则\(x=n-a\)。否则从\(min\{\lceil\frac{b}{a}\rceil-1,\sqrt{b}\}\)到1,枚举\(b\)的因子,得到的第一个因子\(n\),则\(x=\frac{b}{n}-a\)。 时间复杂度为 \(O(\sqrt{b})\) 。
ABK
出题人:邱浩南
题目类型:枚举
思路:
令\(d\)是\(a\)和\(b\)的最大公约数,那么\(a\)和\(b\)的第\(K\)大最大公约数必然是\(d\)的约数。所以求出\(d\),然后枚举求出\(d\)的第\(K\)大的约数即可。从\(1\)到\(\sqrt{d}\)枚举\(d\)的约数,并记录下所有的约数。如果枚举到第\(K\)个约数\(i\)则,结果为\(\frac{d}{i}\)。否则在记录下的因子倒序找出对应的第\(K\)大的因子。注意d为平方数和边界条件的判断即可。 时间复杂度为 \(O\Big(log({max\{a,b\}})+\sqrt{gcd(a,b)}\Big)\)
string multiply
出题人: 谢勇
题目类型: 简单字符串处理,I/O
思路:
找出'*'字符,把这个字符改成'\0',之后的内容转成十进制整数(建议用sscanf),然后输出即可。
Vicsek分形
出题人: 邱浩南
题目类型: 递归
思路:
使用二维数组作为缓冲,计算出8阶图像。输出的时候计算第n阶图像的左上角的坐标即可。
我们先把所有的点都置成'.',下面我们只需要关心'#'的位置。观察可知道,n阶图像是由5个n-1阶图像组成的,所以递归即可,当n=1时就一个字符'#'。
输出时,n=8时,x=0,y=0,width=2187;所以n=1时,x=1093,y=1093,width=1;依次减掉对应阶起始坐标的的偏移值即可。
Words
出题人: 王晨宇
题目类型: 枚举,Hash
思路: 枚举2,3,4的词根,把词根Hash到一个数组计数即可。
简单的Hash函数可以把词根看成一个26进制数。\(26^4 = 456976 \lt 500000\) 。 时间复杂度为\(O(\sum_{i=1}^{k}{length(string_i)})\)
火柴棍
出题人: 王文
题目类型: 模拟,枚举
思路:
枚举所有的x+y=z 或 x-y=z 的等式,然后判断是否和输入的等式是否最多只移动了一根火柴棍。
会位运算的话写程序不容易错。不会的话,可以手工构造添加或移动一根火柴数字的可转换状态。
int m[12][2]={{0,8},{1,7},{3,9},{5,6},{5,9},{6,8},{9,8},
{0,6},{0,9},{2,3},{3,5},{6,9}};
第一行的前7个(n,m)是从n转换到m,需要加1根火柴,移动半步;
第二行的后5个(n,m)是从n转换到m,不需要加火柴,移动1步。
Endless Jump
出题人: 王文
题目类型: 动态规划
思路:
经典DP模版题,从左上到右下算一遍,再从右下到左上算一遍,两者累加即可。 时间复杂度为 O(nm) 。
从左上到右下算一遍:
从右下到左上算一遍:
浙公网安备 33010602011771号