1115:http://acm.jlu.edu.cn/joj/showproblem.php?pid=1115
非常简单,直接按照题目说的来做就可以。
1116:http://acm.jlu.edu.cn/joj/showproblem.php?pid=1116
一开始读题不仔细,以为只有两台电脑,这样的话就是一个简单的模线性方程。后来发现电脑数不超过20,觉得应该是中国剩余定理,结果这题最简单的模拟都0.00S过了。
1117:http://acm.jlu.edu.cn/joj/showproblem.php?pid=1117
这个题目就是一个原始的广度搜索。存储字符串一开始想用Trie树,但是觉得复杂,用hash表就很简单。我用的是双重散列解决冲突,这样可以省去一个指针成员,能节省不少空间。具体的做法就是为每个人名分配一个ID,用无向图表示他们之间的关系,如果两个人合作发表过一篇论文,他们对应的ID之间就有一条边相连。首先读入p篇论文描述,从中构造出图,然后从Erdos, P.开始进行广度搜索,然后依次读入n个人名,每读入一个人名就计算出相应的ID,根据ID检索出他的Erdos编号。用Trie树的实现思路就是把所有的人名建成Trie,从0开始为依次读入的每个新的名字分配ID。我的程序使用双重散列,在一个字符串数组中存储每一个名字,名字的ID就是这个名字在数组中的下标。
1118:http://acm.jlu.edu.cn/joj/showproblem.php?pid=1118
原题概述:Ouroboros的意思是食尾蛇,它是古埃及神话中的一种动物。Ouroboros数是这样一类数:它是一个2^n位bit的二进制数(n由输入指定),把它的这2^n位bit排成一个圆环,依次从每一个bit开始往后数够n个bit,这n个bit做为一组形成一个n位bit的二进制数,显然共能取出2^n个不同的二进制数,这2^n个不同的二进制数互不相同(即从它生成了0---2^n-1这2^n个数)。而且很显然对于给定的n,Ouroboros数不唯一,因为任何一个Ouroboros数做循环移位也都会得到另一个Ouroboros数。题目中只关注最小的那个Ouroboros数。输入n,k,要求输出对应的最小的Ouroboros数生成的第k个数。
例如,对于n=2,0011就是一个Ouroboros数,因为把它排成一个圆环,依次取出2位,得到:00, 01, 11, 10。而且,0011还是n=2时的最小的Ouroboros数。其它的Ouroboros数是0110,1100,1001。那么,给定n=2,k = 0时应该输出0,k=1时应该输出1,k=2时应该输出3,k=3时应该输出2。
分析:先想到的,找到一个Ouroboros数,由它循环移位得到的其它数也都是Ouroboros数,共有2^n个,它们互相等价,那么给定n,这样的等价类是否唯一。但这个问题对问题求解没有关系。
穷举所有的Ouroboros数显然不可能,因为给定n,Ouroboros数是一个2^n位的二进制数,它的范围就是2^(2^n)。由于Ouroboros数生成了0---2^n-1这2^n个数的一个排列,这个排列中的每个数s都有这样的特点:s是一个n位bit的二进制数;s的高n-1个bit是它的前趋的低位的n-1个bit,s的低n-1位的bit是它的后继的高n-1位bit。因此,只要找到了一个0---2^n-1的一个闭合的字面值最小的排列,就找到了问题的解。
由于s和它的后继只有一个二进制位不同,所以s只有两个可能的后继:2 * s mod 2^n, (2 * s + 1) mod 2^n。令第一个数为0,搜索即可。
我的程序使用搜索,AC的成绩是0.01S。这个题目应该还能往下推导得出数学公式,但是没有进展,暂时把思路记下来。这个序列的特征是非常有规律的,把前几个序列记在这里:
n = 2: 0 1 3 2
n = 3: 0 1 2 5 3 7 6 4
n = 4: 0 1 2 4 9 3 6 13 10 5 11 7 15 14 12 8
n = 5: 0 1 2 4 8 17 3 6 12 25 18 5 10 20 9 19 7 14 29 26 21 11 22 13 27 23 1
5 31 30 28 24 16
n = 6:
0 1 2 4 8 16 33 3 6 12 24 49 34 5 10 20 40 17 35 7
14 28 57 50 36 9 18 37 11 22 44 25 51 38 13 26 52 41 19 39
15 30 61 58 53 42 21 43 23 46 29 59 54 45 27 55 47 31 63 62
60 56 48 32