OD410.最富裕的小家庭★★★★★★
题目描述:
在一颗树中,每个节点代表一个家庭成员,节点的数字表示其个人的财富值,一个节点及其直接相连的子节点被定义为一个小家庭。
现给你一颗树,请计算出最富裕的小家庭的财富和。
输入描述:
第一行为一个数 N,表示成员总数,成员编号 1~N。1 ≤ N ≤ 1000
第二行为 N 个空格分隔的数,表示编号 1~N 的成员的财富值。0 ≤ 财富值 ≤ 1000000
接下来 N -1 行,每行两个空格分隔的整数(N1, N2),表示 N1 是 N2 的父节点。
输出描述:
最富裕的小家庭的财富和
# 最富裕的小家庭
n = int(input())
wealth = list(map(int, input().split()))
# 成员编号1~N,为和财富值的索引对应,在数组头插一个0
wealth.insert(0, 0)
# 初始化父节点的值
family = []
family.extend(wealth)
for _ in range(n - 1):
f, c = map(int, input().split())
# 当某父节点新增子节点时,财富值可累加
family[f] += wealth[c]
print(max(family))
OD343.最长子字符串的长度(一)★★★★★★
题目描述:
给你一个字符串 s,首尾相连成一个环形,请你在环中找出 'o' 字符出现了偶数次最长子字符串的长度。
输入描述:
输入是一个小写字母组成的字符串
输出描述:
输出是一个整数
备注:
- 1 ≤ s.length ≤ 500000
- s 只包含小写英文字母
# 最长子字符串的长度(一)
s = list(map(str, input()))
k = 0
a = []
if s.count('o') % 2 == 0:
print(len(s))
else:
for i in range(len(s)):
if s[i] == 'o':
a.append(i)
print(max(len(s[:a[-1]]), len(s[a[0]+1:])+len(s[:a[0]])))
OD345.密码输入检测★★★★★★
题目描述:
给定用户密码输入流 input,输入流中字符 '<' 表示退格,可以清除前一个输入的字符,请你编写程序,输出最终得到的密码字符,并判断密码是否满足如下的密码安全要求。
密码安全要求如下:
- 密码长度 ≥ 8;
- 密码至少需要包含 1 个大写字母;
- 密码至少需要包含 1 个小写字母;
- 密码至少需要包含 1 个数字;
- 密码至少需要包含 1 个字母和数字以外的非空白特殊字符;
注意空串退格后仍然为空串,且用户输入的字符串不包含 '<' 字符和空白字符。
输入描述:
用一行字符串表示输入的用户数据,输入的字符串中 '<' 字符标识退格,用户输入的字符串不包含空白字符,例如:ABC<c89%000<
输出描述:
输出经过程序处理后,输出的实际密码字符串,并输出改密码字符串是否满足密码安全要求。两者间由 ',' 分隔, 例如:ABc89%00,true
# 密码输入检测
s = list(map(str, input()))
flag = [0, 0, 0, 0, 0]
to_remove = []
for i in s:
if i == '<':
if len(to_remove) > 0:
to_remove.pop()
else:
to_remove.append(i)
# 根据密码安全要求判断
for i in range(len(to_remove)):
if len(to_remove) >= 8:
flag[0] = 1
if 'a' <= to_remove[i] <= 'z':
flag[1] = 1
if 'A' <= to_remove[i] <= 'Z':
flag[2] = 1
if to_remove[i].isdigit():
flag[3] = 1
if not to_remove[i].isdigit() and not to_remove[i].isalpha():
flag[4] = 1
if flag == [1, 1, 1, 1, 1]:
print(''.join(to_remove) + ',' + 'true')
else:
print(''.join(to_remove) + ',' + 'false')
OD350.分配土地★★★
题目描述:
从前有个村庄,村民们喜欢在各种田地上插上小旗子,旗子上标识了各种不同的数字。
某天集体村民决定将覆盖相同数字的最小矩阵形的土地分配给村里做出巨大贡献的村民,请问此次分配土地,做出贡献的村民种最大会分配多大面积?
输入描述:
第一行输入 m 和 n,
- m 代表村子的土地的长
- n 代表土地的宽
第二行开始输入地图上的具体标识
输出描述:
此次分配土地,做出贡献的村民种最大会分配多大面积
备注:
- 旗子上的数字为1~500,土地边长不超过500
- 未插旗子的土地用0标识
# 分配土地
# 输入土地的长宽,即数组的行列数
m, n = map(int, input().split())
# 输入二维数组
land = [input().split() for _ in range(m)]
# 定义一个列表用于存储