UVA题解三

UVA 127

题目描述:\(52\)张扑克牌排成一列,如果一张牌的花色或者数字与左边第一列的最上面的牌相同,则将这张牌移到左边第一列的最上面,如果一张牌的花色或者数字与左边第三列的最上面的牌相同,则将这张牌移到左边第三列的最上面。只有最上面的牌可以移动,如果同时有多张牌可以移动,则先移动最左边的牌,若某张牌可以移到左边第三列的上面,则优先移到左边第三列。若某个时刻某一列为空,则那一列后面的列往前移动。求最后还剩多少列,以及每一列有多少张牌。

solution
直接栈模拟。因为每张牌最多前进\(52\)次,乘上每次查找哪一张牌可以移动,所以时间复杂度是三次方的。
时间复杂度:\(O(n^3)\)

UVA 128

题目描述:输入一个字符串,将每个字符转化为对应的ASCII码的八位二进制数,按顺序串成一个超长的二进制数,现在要在这个超长二进制数后面加上一个十六位的二进制数,使得最终的二进制数能被\(34943\)整除。求出这个十六位二进制,输出对应的十六进制。

solution
将那个超长二进制数对\(34943\)取模,然后\(34943\)与余数的差就是答案,注意\(0\)的情况。
时间复杂度:\(O(字符串长度)\)

UVA 133

题目描述:\(n\)个人围成一圈,顺时针从\(1\)到\(n\)编号,某个面试官从\(1\)开始顺时针数数,数到\(k\)的倍数的人出局,同时另一个面试官从\(n\)开始逆时针数数,数到\(m\)的倍数的人出局。如果数到同一个人,则只有那个人出局。直到最后一个人出局为止。输出每一轮出局的人。

solution
简单模拟,可以用双向链表优化,但数据比较小,可以不优化
时间复杂度:\(O(n^3)\)或\(O(n^2)\)

UVA 136

题目描述:将质因子只有\(2, 3, 5\)的数从小到大排序,第一个数是\(1\),然后才是\(2\),输出第\(1500\)个数

solution
打表。\(20\)秒出结果。

UVA 138

题目描述:若一个数\(n\),存在一个数\(m\),使得\(1\)到\(m\)的和等于\(m\)到\(n\)的和,那么称\(n\)为神奇的数,输出前十个神奇的数以及他们对应的\(m\)。

solution
打表。这里有一个技巧,就是n不断递增的同时,m也是递增的,所以可以双指针移动。2秒出结果。可以直接交这个程序,不打表。

UVA 143

题目描述:平面上给出一个三角形,问三角形里有多少个点。

solution
因为数据比较小,所以可以枚举点,然后判断点是否在三角形内,可以用等面积法,也可以用射线法。也可以进行优化,只枚举\(x\)坐标,然后算出\(y\)的范围。要注意的是这个三角形可能会退化为一条直线,所以枚举的点只能在三角形的特征矩形(能围住三角形内所有点的,边平行于坐标轴的最小矩形)里。
时间复杂度:\(O(询问次数*坐标范围)\)

UVA 146

题目描述:规定了每个小写字母出现的次数,可以生成很多个字符串,将这些字符串按字典序排序,先给出一个字符串,问这个字符串的后继,若无,则输出No
Successor

solution
用笔模拟一些构造的过程,容易得出结论:从右往左找到第一个比右边字母要小的位置,然后在它的右边找到比它大的最小的字母替换它,最后将该位置右边的字母从小到大排序,得到的字符串就是后继。若找不到这个位置,则无解。
时间复杂度:\(O(26*字符串长度)\)

UVA 147

题目描述:给出一种货币的所有面值(\(m\)种),给出一个数(\(n\)),用这种货币来表示这个数,输出方案数。

solution
完全背包。
时间复杂度:\(O(nm)\)

UVA 151

题目描述:有\(n\)座城市,求一个最小的\(m\),使得从\(1\)开始数,然后往后数\(m\),循环数,最后一个数的数是\(13\)。

solution
穷举\(m\),模拟,类似于UVA 133,如果最后一个数是\(13\),则输出。
时间复杂度:\(O(m^2n^2)\)或\(O(m^2n)\)

UVA 156

题目描述:给出\(n\)个单词,找出哪些单词不能由其它单词重新排列得到。

solution
先记录每个单词的每个字母出现次数,两两枚举,若两个单词的每个字母的出现次数都相同,则这两个单词可以通过重新排列得到。
时间复杂度:\(O(26n^2)\)

05-11 22:42