不确定这是否是最佳标题。关于该程序要做什么的解释如下,我的版本仅适用于第一个例子但是当你得到例如1 1 3 1 1 2时它不起作用因为我无法弄清楚一个好的处理这么多变化的方法,特别是如果K大于3且限制为50.我的版本:
N, K, M = map(int, input().split())
niz = list(map(int, input().split()))
nizk = list(range(1, K+1))
izlazi = []
for r in range(0, M):
operacija = list(map(int, input().split()))
index = 0
if operacija[0] == 2:
nizkk = []
for z in range(0, len(nizk)):
if nizk[z] in niz:
continue
else:
izlazi.append(-1)
break
for p in range(0, N):
if niz[p] not in nizkk:
nizkk.append(niz[p])
nizkk.sort()
if nizkk == nizk:
index = p
izlazi.append(index+1)
break
else:
continue
else:
index, repl = map(int, operacija[1:])
niz[index - 1] = repl
print(izlazi)
在输入的第一行中应该有N,K,M(1 <= N,M <= 100k,1 <= K <= 50,你不需要实际检查这个测试的数字将始终在这些范围内)。在第二行输入中,您输入了一个数字列表,这些数字是您之前输入的N的长度。 M是您将在以下输入行中执行的操作数。可以有2个操作。如果输入1 pv(p =要替换的数字索引,v替换它的数字),或者如果输入2,则需要找到由范围(1,K + 1)定义的最短数字数组。您在第2行中输入的数字列表,可能会更改为操作1.如果它不存在,则应输出-1,如果它存在,则应输出您查看的数组中的数字长度(数字可以是2,1, 3,如果你正在寻找1,2,3,如果你正在寻找1,2,3等,你有2,1,1,3作为最短的解决方案,它的长度是4) 。此外,替换操作不会从0开始计数,而是从1开始计数。因此请注意管理列表。
答案 0 :(得分:0)
我有以下想法:
最小长度序列要么从第一个元素开始,要么不包含第一个元素,因此等于没有第一个元素的相同序列的最小长度。
所以我们这里有递归。
对于序列[1,1,3,2,1,1]和[1,2,3],我们将有:
从起始元素[1,1,3,2,1,1]开始的最小长度是4
从起始元素__ [1,3,2,1,1]开始的最小长度是3
从起始元素____ [3,2,1,1]开始的最小长度是3
从起始元素______ [2,1,1]开始的最小长度为-1
可以在这里停下来
[4,3,3] = 3
如果从第一个元素开始,您已经为min length实现了该部分。现在需要将其作为函数提取并创建递归函数。
一些元代码:
函数GetMinLength(seq)
{
minLengthFromFirstElement = GetMinLenthFromFirstElement(seq)
minLengthFromRest = GetMinLength(seq [1:])//重复呼叫
return Min(minLengthFromFirstElement,minLengthFromRest)// - 1个结果不应该计算,添加额外的代码来处理它 }
不幸的是我不知道python,但我可以在F#上提供代码,以备不时之需。
修改强>:
试试这个:
N, K, M = map(int, input().split())
niz = list(map(int, input().split()))
nizk = list(range(1, K+1))
izlazi = []
def GetMinLengthStartingFromFirstElement(seq):
nizkk = []
for z in range(0, len(seq)):
if seq[z] in nizk:
continue
else:
return -1
for p in range(0, len(seq)):
if seq[p] not in nizkk:
nizkk.append(seq[p])
nizkk.sort()
if nizkk == nizk:
index = p
return index+1
else:
continue
return -1
def GetMinLength(seq):
if len(seq) == 0:
return -1
else:
curMinLength = GetMinLengthStartingFromFirstElement(seq)
if curMinLength == -1:
return -1
minLengthFromRest = GetMinLength(seq[1:])
if minLengthFromRest > -1:
return min(curMinLength,minLengthFromRest)
else:
return curMinLength;
for r in range(0, M):
operacija = list(map(int, input().split()))
index = 0
if operacija[0] == 2:
minLength = GetMinLength(niz)
izlazi.append(minLength)
else:
index, repl = map(int, operacija[1:])
niz[index - 1] = repl
print(izlazi)