IOI训练营20xx (INOI 2011)
我们已经进入了21世纪,小学生在4班学习动态编程。IOI训练营已经退化为无穷无尽的测试序列,带有负分。在训练营结束时,根据整个测试序列中最佳连续分数段(即没有间隙)的总和对每个学生进行评估。
然而,这些年来,学生们并没有太大的变化,他们要求在评估程序上有所放松。作为一项让步,训练营协调员同意允许学生在计算他们的最佳部分时最多参加一定数量的测试。
例如,假设Lavanya是训练营的一名学生,并且已经进行了十次测试,其中她的分数如下所示。
测试1 2 3 4 5 6 7 8 9 10
标记6 -5 3 -7 6 -1 10 -8 -8 8
在这种情况下,在不允许丢弃任何测试的情况下,最好的段是测试5-7,它总共产生15分。如果Lavanya被允许在一个片段中丢弃最多2个测试,那么最好的片段是测试1-7,在丢弃测试2和4之后,它总共产生24分。如果她被允许在一个片段中丢弃6个测试,那么通过采用整个列表并丢弃5个负的条目来获得最好的总分,得到总共33分。
您将获得N个测试标记和一个数字K的序列。当最多K个标记可能从片段中丢弃时,您必须计算序列中最佳片段的总和。
1≤i≤N,1≤j≤K的解决方案提示,让Besti表示在位置i结束的最大分段,其中最多有j个标记被丢弃。Besti是经典的最大子段或最大子阵问题。对于j≥1;从Besti归纳计算Besti。
输入格式输入的第一行包含两个整数N和K,其中N是将为其提供标记的测试的数量,K是可以从片段中删除的条目的限制。
紧跟其后的是N行输入,每行都包含一个整数。测试i,I∈{1,2,…}的分数,N}在行i+1中提供。
输出格式输出是单个数字,这是从丢弃最多K值的数据段中可以获得的最大分数。
约束您可以假设1≤N≤104和0≤K≤102。每个测试的标记都在-104…范围内104。在40%的情况下,你可以假设N≤250。
def sumsub(ls,k):
if k==0:
return(sum(ls))
else:
ls.sort()
if len(ls)>=k:
for j in range(0,k):
if(ls[0]<0):
ls.remove(ls[0])
return(sum(ls))
else:
for i in range(len(ls)):
if ls[0]<0:
ls.remove(ls[0])
return(sum(ls))
n,k= map(int,input().split(" "))
l=[]
smax=0
for i in range(n):
m=input()
l.append(int(m))
for i in range(n):
for j in range(n,0,-1):
s=sumsub(l[i:j],k)
if s>smax :
smax=s
print(smax)我正在得到正确的答案,但对一些人来说,时间限制已经超过了。如果你能为此提供一个解决方案,那将是非常有帮助的。
发布于 2020-03-25 23:56:53
当你定义的函数每次执行时,有四个'for‘循环在运行。这是超过执行时间限制的最大原因。
https://stackoverflow.com/questions/60830188
复制相似问题