这次题目不怎么难,基本上都在周赛中出现过,python代码附上。
一.代谢写匿名信
这个没有全过,有一个没过,得分率9/10,检查的时候反过来检查刚刚好检查到这里就没检查了就没发现。所以不知道是什么情况过不了。
题目描述
小Q想要匿名举报XX领导不务正业!小Q害怕别人认出他的字迹。 他选择从报纸上剪裁下来英文字母组成自己的举报信。 现在小Q找来了报纸,和自己的举报信的Txt, 你能帮他确定下是否能够完成匿名信吗?
输入描述:
第一行输入报纸上的英文。 第二行输入小Q匿名信的内容。 (1<=len(str)<=10000)
输出描述:
如果能完成输出”Yes”,否则输出”No” (区分大小写,不考虑空格)
示例
示例1
输入
Asdadsadas dsadas
das
输出
Yes
class Solution:
def __init__(self) -> None:
pass
def solution(self, words, msg):
result = None
# TODO: 请在此编写代码
d = {}
for i in msg:
d[i] = 0
for i in msg:
d[i] += 1
for i in words:
if i in d and d[i] > 0:
d[i] -= 1
if sum(d.values()) == 0:
result = 'Yes'
else:
result = 'No'
return result
if __name__ == "__main__":
words = input().strip()
msg = input().strip()
sol = Solution()
result = sol.solution(words, msg)
print(result)
二.寻因找祖
题目描述
寻找因子个数为n的最小整数x
输入描述:
输入整数n。(1<=n<=1000)
输出描述:
输出x。
示例1
输入 3
输出 4
class Solution:
def __init__(self) -> None:
import math
self.log = 1e10
self.a = [0 for i in range(1000)]
self.x = int()
self.p = [2,3,5,7,11,13,17,19,23,29,31,37,39,41,43]
self.l = [math.log(x) for x in self.p]
pass
def dfs(self, d, n, m, y):
if y > self.log:
return 0
if n == 1:
self.log = y
self.x = 1
for i in range(d):
self.x *= self.p[i] ** self.a[i]
return 0
for i in range(1, m+1):
if i*i > n:
break
if n % i == 0:
if i > 1:
self.a[d] = i - 1
self.dfs(d+1, n/i, i, y+self.l[d]*(i-1))
if n / i <= m and n / i != i:
self.a[d] = int(n/i) - 1
self.dfs(d+1, i, int(n/i), y+self.l[d]*(n/i-1))
def solution(self, n):
result = None
# TODO: 请在此编写代码
self.dfs(0, n, n, 0)
result =self.x
return result
if __name__ == "__main__":
n = int(input().strip())
sol = Solution()
result = sol.solution(n)
print(result)
三.小Q新式棋盘
题目描述
已知棋盘大小为n*n。 每个位置都有自己的权值q。 该棋盘中有多少对行权值和小于列权值和。
输入描述:
第一行输入整数n。(1<=n<=100)表示棋盘的大小 以下n行每行输入n个整数表示棋子的权值。(1<=a<=1000)
输出描述:
输出小Q的分值。
示例1
输入:
3
1 2 3
1 2 3
1 2 3
输出:
3
示例2
输入:
3
5 7 8
4 5 3
1 6 6
输出:
4
class Solution:
def __init__(self) -> None:
pass
def solution(self, n, vector):
result = None
# TODO: 请在此编写代码
sum_r = [sum(i) for i in vector]
sum_c = [0 for i in range(n)]
for i in range(n):
for j in range(n):
sum_c[i] += vector[j][i]
sum_r.sort()
sum_c.sort()
sum_r = sum_r[::-1]
sum_c = sum_c[::-1]
sum_c.append(0)
result = 0
i = 0
j = 0
while i < n:
if sum_r[i] >= sum_c[j]:
result += j
i += 1
else:
j += 1
return result
if __name__ == "__main__":
n = int(input().strip())
vector = []
for i in range(n):
vector.append([int(item) for item in input().strip().split()])
sol = Solution()
result = sol.solution(n, vector)
print(result)
四.拯救公主
题目描述
在Flower Kingdom里,住着一位美丽的公主Ana,有一天Ana得了一种怪病,神医告知国王,在遥远的幽谷中有一种药能治愈Ana,但是神医只有一份不完整的地图,地图的描述如下:
该地图的共有3行,第一行有m列,m为奇数,第二行有m+1列,第三行有m+2列;
每一行用一个字符串表示,只有【两种字符】;'.'表示草地,可以从它上面通过,'*'表示岩石,每一行最多一个'*'
入口在左上角,由于在对角线方向上,因此即使对角线两边都有岩石,但是缝隙较大,人可以通过,故人可以向八个方向行走;
真实地图是由该地图的【每一行无限循环】得到的,这种神奇的药草就生长在第x行第y列的草地上,药草可能会在岩石上;
国王决定派遣勇敢的骑士David前去寻找拯救公主的解药;现在聪明的你是否知道David能否找到该药?
输入描述:
第一行输入T表示测试用例组数,接下来每组测试用例分别输入
m (1<m<1000,x(1<=x<=3).
y(1<=y<=1e9);
再接下来输入三行字符串,长度分别为m,m+1,m+2;
输出描述:
每个测试用例,输出YES或者NO
示例1
输入
1
3 1 10
.*.
...*
..*..
输出
NO
class Solution:
def __init__(self) -> None:
pass
def solution(self, arr, vec):
result = None
# TODO: 请在此编写代码
m, x, y = arr
rocks = [y, y, y]
for i in range(3):
for j in range(m+i):
if vec[i][j] == '*':
rocks[i] = j+1
break
if (y-rocks[x-1]) % (m+x-1) == 0:
return 'NO'
tmp = []
up = min(y, m*(m+1)*(m+2))
while rocks[2] < up:
tmp.append(rocks[2])
rocks[2] += m+2
for i in range(1,-1,-1):
new_tmp = []
while rocks[i] < up:
if rocks[i] in tmp:
new_tmp.append(rocks[i])
rocks[i] += m+i
tmp = new_tmp
if new_tmp:
result = 'NO'
else:
result = 'YES'
return result
if __name__ == "__main__":
sol = Solution()
T = int(input().strip())
for i in range(T):
arr = [int(item) for item in input().strip().split()]
vec = []
for i in range(3):
vec.append(input().strip())
result = sol.solution(arr, vec)
print(result)