[解题报告] CSDN竞赛第12期
Posted lijiancheng0614
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[解题报告] CSDN竞赛第12期相关的知识,希望对你有一定的参考价值。
CSDN编程竞赛报名地址:https://edu.csdn.net/contest/detail/25
1. 豚鼠排名榜
题目
已知字符A.B,C。每个字符都有自己的权值q。 现不知道权值q,只知道A,B,C的三次比较结果。
输入描述:
输入三个字符串表示三次比较的结果
输出描述:
输出结果,如果不存在输出”Impossible”
输入样例:
A<B
B>C
C>A
输出样例:
ACB
解题报告
模拟,假设 x < y 则构建 x -> y 的有向边,
显然若存在结果 x < y < z,则 x 的出度为 2,y 的入度、出度均为 1,z 的入度为 2
出度用负数表示,入度用正数表示,则 3 个点的度为 -1, 0, 1
用输入的比较结果统计并比较即可
class Solution:
def __init__(self) -> None:
pass
def solution(self, exp1, exp2, exp3):
d = 'A': 0, 'B': 0, 'C': 0
for e in [exp1, exp2, exp3]:
if e[1] == '<':
d[e[0]] -= 1
d[e[2]] += 1
else:
d[e[0]] += 1
d[e[2]] -= 1
if len(set(d.values())) < 3:
return 'Impossible'
return ''.join(sorted(d.keys(), key=lambda x: d[x]))
if __name__ == "__main__":
exp1 = input().strip()
exp2 = input().strip()
exp3 = input().strip()
sol = Solution()
result = sol.solution(exp1, exp2, exp3)
print(result)
2. 字符串转换
题目
已知一个字符串a,b。 字符串b中包含数量不等的特殊符号“.”,“*”(字符串存在没有特殊符号或者全由特殊符号组成的情况)。 “.”表示该字符可以变成任意字符,“* ”表示该字符的前一个字符可以变成任意多个。 现在我们想知道b可否通过特
殊符号变成a。 a* 可以转化为a,aa,aaa,aaaa…
输入描述:
两行字符串
输出描述:
yes/no
输入样例:
aa
a*
输出样例:
yes
解题报告
模拟,正则表达式判断
import re
class Solution:
def __init__(self) -> None:
pass
def solution(self, a, b):
if b.startswith('*'):
return 'no'
g = re.search(b, a)
if g and g.group() == a:
return 'yes'
return 'no'
if __name__ == "__main__":
a = input().strip()
b = input().strip()
sol = Solution()
result = sol.solution(a, b)
print(result)
3. 蚂蚁家族
题目
小蚂蚁群是一个庞大的群体,在这个蚂蚁群中有n只小蚂蚁 ,为了保证所有蚂蚁在消息传送的时候都能接收到消息,需要在他们之间建立通信关系。就是要求小蚂蚁都可以通过多只或者直接联系到其他人。 已知几条小蚂蚁之间有通信关系,请问还需要再新建至少多少条关系?
输入描述:
第一行输入整数n,m;n为小蚂蚁总数;m为关系数。(1<=n,m<=1000)
以下m行每行m对整数x,y。(代表x与y有联系)
输出描述:
输出最少需要新建关系数。
输入样例:
4 3
1 2
2 3
3 4
输出样例:
0
解题报告
图论。用并查集统计有多少个连通块,块数减一即所需新建关系数,注意点的标号可能大于 n
class Solution:
def __init__(self) -> None:
pass
def getf(self, x):
if self.f[x] == x or self.f[x] == 0:
return x
return self.getf(self.f[x])
def solution(self, n, m, vector):
self.f = [i for i in range(n + 2)]
v = set()
for x, y in vector:
v.add(x)
v.add(y)
x = self.getf(self.f[x])
y = self.getf(self.f[y])
self.f[x] = y
g = set()
for i in v:
self.f[i] = self.getf(i)
g.add(self.f[i])
return len(g) - 1 - len(v) + n
if __name__ == "__main__":
arr_temp = [int(item) for item in input().strip().split()]
n = int(arr_temp[0])
m = int(arr_temp[1])
vector = []
for i in range(m):
vector.append([int(item) for item in input().strip().split()])
sol = Solution()
result = sol.solution(n, m, vector)
print(result)
4. 小股炒股
题目
已知n天后的股票行情,现在已有的本金是m, 规定只能入手一次股票和抛售一次股票。 最大收益(含本金)是?
输入描述:
第一行输入整数n,m。(1<=n<=1000,1<=m<=10000)
第二行输入n个整数表示某股票单股价格p。(1<=p<=1000)
输出描述:
输出小最大收益
输入样例:
2 4
3 7
输出样例:
8
解题报告
模拟,枚举在第 i 天买入第 j 天卖出,则买入股票数 x = ⌊ m / a r r [ i ] ⌋ x = \\lfloor m / arr[i] \\rfloor x=⌊m/arr[i]⌋
收益为 m + ( a r r [ j ] − a r r [ i ] ) ∗ x m + (arr[j] - arr[i]) * x m+(arr[j]−arr[i])∗x
统计并维护最大值即可
class Solution:
def __init__(self) -> None:
pass
def solution(self, n, m, arr):
s = m
for i, a in enumerate(arr):
x = int(m / a)
z = m - a * x
for j in range(i + 1, n):
b = arr[j]
s = max(s, z + b * x)
return s
if __name__ == "__main__":
arr_temp = [int(item) for item in input().strip().split()]
n = int(arr_temp[0])
m = int(arr_temp[1])
arr = [int(item) for item in input().strip().split()]
sol = Solution()
result = sol.solution(n, m, arr)
print(result)
以上是关于[解题报告] CSDN竞赛第12期的主要内容,如果未能解决你的问题,请参考以下文章