竞赛练习任务(Python)

2024-09-30 08:26:38 发布

您现在位置:Python中文网/ 问答频道 /正文

不知道这是不是最好的标题。下面是对这个程序应该做什么的解释,我的版本只适用于第一个例子,但是在第二个例子中它不起作用,例如1 1 3 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 p v(p=要替换的数字的索引,v是替换的数字),或者如果输入2,则需要在第2行中输入的数字列表中查找由范围(1,K+1)定义的最短数字数组,并且可能会使用操作1进行更改。如果它不存在,它应该输出-1如果它存在,它应该输出数组中的数字长度(如果你在寻找1,2,3,数字可以像2,1,3,如果你在寻找1,2,3等等,你有2,1,1,3作为最短的一个是解决方案,它的长度是4)。此外,替换操作不从0开始计数,而是从1开始计数。所以在管理列表时要小心。你知道吗

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


Tags: inltmapinputindexifrange数字
1条回答
网友
1楼 · 发布于 2024-09-30 08:26:38

我有以下想法:
最小长度序列要么从第一个元素开始,要么不包含第一个元素,因此等于没有第一个元素的同一序列的最小长度。
所以这里有递归。
对于序列[1,1,3,2,1,1]和[1,2,3],我们有:
距起始元素[1,1,3,2,1,1]的最小长度为4
从起始元素开始的最小长度\uuuuu1,3,2,1,1]是3
从起始元素开始的最小长度为3
从起始元素开始的最小长度为-1
可以在这里停下来。
[4,3,3]=3时结果最小

如果零件从第一个元素开始,则已经实现了最小长度的零件。现在需要将其提取为函数并创建递归函数。你知道吗

一些元代码:

function GetMinLength(seq)
{
minLengthFromFirstElement = GetMinLenthFromFirstElement(seq)
minLengthFromRest = GetMinLength(seq[1:]) //recusive call
return Min(minLengthFromFirstElement, minLengthFromRest )//-1 results should not count, add extra code to handle it
}

不幸的是,我不懂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)

相关问题 更多 >

    热门问题