1. T1
问题:
小团深谙保密工作的重要性,因此在某些明文的传输中会使用一种加密策略,小团如果需要传输一个字动串S,则他会为这个字符串添加一个头部字符串和一个尾部字符串。头部字符用满足至少包含一个“MT 子序列,且以T结尾。尾部字符串需要满足至少包含一MT 序列,且以M开头。例如AAAMT和MAAAT都是一个合法的头部字符串,而MTAAA就不是合法的头部字符串。很显然这样的头尾字符串并不-定是唯一的,因此我们还有一个约束,就是S是满足头尾字符串合法的情况下的最长的字符串。很显然这样的加密策略是支持解码的,给出你—个加密后的字符串,请你找出中间被加密的字符串S。
输入:
加密字符串
输出:
最长可能加密前字符串
思路:
用find和rfind找位置
代码:
def T1(s):
substr = s[s.find("M")+1:]
substr = substr[substr.find("T")+1:]
substr = substr[:substr.rfind("T")]
substr = substr[:substr.rfind("M")]
return substr
2. T2
问题:
美团打算选调n名业务骨干到n个不同的业务领域,本着能者优先的原则,公司将这n个人按照业务能力从高到低编号为1-n。编号靠前的人具有优先选择的权力,每个人都会填写一个意向。这个意向是一个1-n的排列,表示一个人希望去的业务区域顺序,如果有两个人同时希望去某个业务区域则优先满足编号小的人,每个人最终只能去一个业务区域。
求解,每个人最终去的区域
输入:
输入第一行是一个正整数n,表示业务骨干和业务区域数量。(n<=300)
接下来n行,每行n个数,第i行表示i号业务员的意向顺序
输出:
n个正整数,第i个正整数表示第i号业务骨干最终去的业务区域。
思路:
用set存储已经被选择的业务。
代码:
def T1(n, arr):
workset = set() # 维护被选择的业务
result = [] #输出
for i in arr:
for j in i:
if j in workset:
continue
else:
workset.add(j)
result.append(j)
break
return result
3. T3
问题:
小团惹小美生气了,小美要去找小团“讲道理”。小团望风而逃,他们住的地方可以抽象成一棵有n个结点的树,小美位于x位置,小团位于y位置。小团和小美每个单位都可以选择不动或者向相邻位置移动,假设小美足够聪明,显然小团会无路可逃,只能延缓一下呗讲道理的时间。请问最多经过多少个单位时间后,小团会被追上。
输入:
输入第一行包括三个整数,n, x, y, 分别表示树上的结点数量,小美所在的位置和小团所在的位置。(1 <= n <= 50000)
接下来n-1行,每行两个整数u, v,表示u号位置和v号位置之间有一条边,即u和v彼此相连。
输出:
输出仅包含一个整数,表示小美追上小团所需的时间。
思路:
分别以x、y为根节点进行深度优先遍历,计算根节点距离其它节点的距离。
由题目,disx必然比disx大(x追赶y),聪明的小团会让距离变得尽量大(max)
代码:
def dfs(nodelist, dis, start, equl, step):
for v in nodelist[start]:
if v == equl:
continue
dis[v] = step + 1
dfs(nodelist, dis, v, start, step + 1)
def T3(n, x, y, arr):
nodedict = {}
for i in range(1, n+1):
nodedict[i] = []
for i in arr:
nodedict[i[0]].append(i[1])
nodedict[i[1]].append(i[0])
disx = [0 for i in range(n+1)]
disy = [0 for i in range(n+1)]
dfs(nodedict, disx, x, -1, 0)
dfs(nodedict, disy, y, -1, 0)
ans = 0
print(disx)
print(disy)
for i in range(1, n+1):
if disx[i] > disy[i]:
ans = max(disx[i], ans)
return ans
4. T4
问题:
小团和小美各自选择一个[1,m]之间的整数,设小美选择的是l,小团选择的是r,我们认为两个人是默契的需要满足以下条件:
- l 小于等于r。
- 对于序列中的元素x,如果0<x<l,或r<x<m+1,则x按其顺序保留下来,要求保留下来的子序列单调不下降。
小团为了表现出与小美最大的默契,因此事先做了功课,他想知道能够使得两人默契的二元组<l,r>一共有
多少种。 我们称一个序列A为单调不下降的,当且仅当对于任意的i>j,满足A_i>=A_j。 输入第一行包含
两个正整数m和n,表示序列元素的最大值和序列的长度。(1<=n,m<=100000)
输入:
输入第一行包含两个正整数m和n,表示序列元素的最大值和序列的长度。(1<= n, m<= 100000)
输入第二行包含n个正整数,表示该序列
输出:
输出仅包含一个整数,表示满足条件的二元组数量。
分析:
暴力解法。首先统计所有元组的可能性和对应数量,
例如 [4, 1, 4, 1, 2] -> {‘4.4’: 2, ‘1.4’: 4, ‘1.1’: 2, ‘1.2’: 2, ‘2.4’: 2}
然后遍历元组判读是否符合单调不下降的条件。
代码:
def T4(n, m, order):
usedset = {}
for i in range(n):
for j in range(n):
if order[i] <= order[j] and j != i:
tmp = str(order[i])+"."+str(order[j])
if tmp in usedset:
usedset[tmp] += 1
else:
usedset[tmp] = 1
ans = 0
for k in usedset.keys():
strarr = k.split(".")
l, r = int(strarr[0]), int(strarr[1])
flag = True
ordertmp = []
for i in range(n):
if order[i] not in range(l, r+1):
ordertmp.append(order[i])
for i in range(len(ordertmp)-1):
if ordertmp[i] > ordertmp[i+1]:
flag = False
break
if flag:
ans += usedset[k]
return ans