竞赛练习任务(Python)

时间:2015-11-28 17:21:44

标签: python algorithm

不确定这是否是最佳标题。关于该程序要做什么的解释如下,我的版本仅适用于第一个例子但是当你得到例如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开始计数。因此请注意管理列表。

这些是您可以在程序中输入的示例ulaz = input,izlaz = ouput: enter image description here

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)