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) 。

从左上到右下算一遍:

\[\begin{eqnarray} go[i][j] & = & min & \{ & go[i-1][j] + max \{ 0,a[i][j]-a[i-1][j] \} ,\\ & & & & go[i][j-1] + max\{ 0,a[i][j]-a[i][j-1] \} \\ & & &\} \end{eqnarray}\]

从右下到左上算一遍:

\[\begin{eqnarray} back[i][j]& = & min & \{ & back[i+1][j]+max\{ 0,a[i][j]-a[i+1][j] \} ,\\ & & & & back[i][j+1]+max\{ 0,a[i][j]-a[i][j+1] \} \\ & & & \} \end{eqnarray}\]

\[answer=go[n-1][m-1] + back[0][0] \]

posted on 2015-01-12 21:54  ericxie  阅读(114)  评论(0)    收藏  举报