[解题报告] CSDN竞赛第17期
Posted AlgoComp
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[解题报告] CSDN竞赛第17期相关的知识,希望对你有一定的参考价值。
CSDN编程竞赛报名地址:https://edu.csdn.net/contest/detail/31
1. 判断胜负
题目
已知两个字符串A, B。连续进行读入n次。每次读入的字符串都为A|B。输出读入次数最多的字符串。
解题报告
模拟,统计输出即可
class Solution:
def __init__(self) -> None:
pass
def solution(self, n, vector):
d =
for v in vector:
d[v] = d.get(v, 0) + 1
a = sorted(d.items(), key=lambda x: x[1])
if n > 1 and a[-1][1] == a[-2][1]:
return 'dogfall'
return a[-1][0]
if __name__ == "__main__":
n = int(input().strip())
vector = []
for i in range(n):
vector.append(input().strip())
sol = Solution()
result = sol.solution(n, vector)
print(result)
2. 买铅笔
题目
P老师需要去商店买n支铅笔作为小朋友们参加编程比赛的礼物。她发现商店一共有3种包装的铅笔,不同包装内的铅笔数量有可能不同,价格也有可能不同。为了公平起见,P老师决定只买同一种包装的铅笔。商店不允许将铅笔的包装拆开,因此P老师可能需要购买超过n支铅笔才够给小朋友们发礼物。现在P老师想知道,在商店每种包装的数量都足够的情况下,要买够至少n支铅笔最少需要花费多少钱。
解题报告
模拟,对于数量为 x,价格为 y 的一包铅笔,需要的价钱为: ⌈ n / x ⌉ ∗ y \\lceil n / x \\rceil * y ⌈n/x⌉∗y
遍历并取该值的最小值即可
class Solution:
def __init__(self) -> None:
pass
def solution(self, n, arr):
a = []
for x, y in arr:
a.append(((n - 1) // x + 1) * y)
return min(a)
if __name__ == "__main__":
n = int(input().strip())
arr = []
for i in range(3):
arr.append([int(item) for item in input().strip().split()])
sol = Solution()
result = sol.solution(n, arr)
print(result)
3. 拯救爱情
题目
小艺酱走到一个花之占卜店中。店员小Q看到小艺酱可怜的样子,允许小艺酱免费占卜一次。花瓣占卜:1.一瓣“在一起”,一瓣“不在一起”;开始的花瓣表示“在一起”。2.直到最后一个花瓣落地游戏结束。3.可以选择多朵花,选择撕一朵花就必须撕完。
解题报告
模拟,题目即求 n 个数中挑若干个数,使得这些数之和为奇数且最大,输出最大和
故先求所有数之和,若为奇数则为所求;否则减去最小的奇数
class Solution:
def __init__(self) -> None:
pass
def solution(self, n, arr):
s = 0
b = 200000
for a in arr:
s += a
if a % 2 == 1:
b = min(b, a)
if s % 2 == 1:
return s
return s - b
if __name__ == "__main__":
n = int(input().strip())
arr = [int(item) for item in input().strip().split()]
sol = Solution()
result = sol.solution(n, arr)
print(result)
4. 拯救公主
题目
在Flower Kingdom里,住着一位美丽的公主Ana,有一天Ana得了一种怪病,神医告知国王,在遥远的幽谷中有一种药能治愈Ana,但是神医只有一份不完整的地图,地图的描述如下:该地图共有3行,第一行有m列,m为奇数,第二行有m+1列,第三行有m+2列;每一行用一个字符串表示,只有【两种字符】;‘.'表示草地,可以从它上面通过,‘’表示岩石,每一行最多一个‘’;入口在左上角,由于在对角线方向上,因此即使对角线两边都有岩石,但是缝隙较大,人可以通过,故人可以向八个方向行走;真实地图是由该地图的【每一行无限循环】得到的,这种神奇的药草就生长在第x行第y列的草地上,药草可能会在岩石上;国王决定派遣勇敢的骑士David前去寻找拯救公主的解药;现在聪明的你是否知道David能否找到该药?
解题报告
数学,由于每行最多只有一个岩石,故只有以下两种情况输出 NO:
- 解药这格是岩石
- 解药左方存在一列三行均为岩石
遍历地图求出三行岩石位置 x, y, z(若无 3 个岩石且不是第一种情况则直接输出 YES)
枚举第一行周期性位置 s = x + m * i,若 s < y 且 (s - y) % (m + 1) = 0 且 (s - z) % (m + 2) = 0 则说明存在一列三行均为岩石,输出 NO
枚举到 s >= y 时结束,输出 YES
class Solution:
def __init__(self) -> None:
pass
def solution(self, arr, vec):
m, x0, y0 = arr
x0 -= 1
y0 -= 1
if vec[x0][y0 % (m + x0)] == '*':
return 'NO'
a = []
for v in vec:
for j, c in enumerate(v):
if c == '*':
a.append(j)
if len(a) < 3:
return 'YES'
for i in range(1000000000):
x = a[0] + m * i
if x > y0:
return 'YES'
if (x - a[1]) % (m + 1) > 0:
continue
if (x - a[2]) % (m + 2) > 0:
continue
return 'NO'
return 'YES'
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)
以上是关于[解题报告] CSDN竞赛第17期的主要内容,如果未能解决你的问题,请参考以下文章