python3.8,jupyter notebook运行结果:
详细思路在下面代码,核心思路:
#从下标为1的元素,第二个元素开始
当然:#如果剩下序列少于当前最长序列,则退出,说明就算剩下全是不下降序列也不能更新答案,没有继续的必要
#将当前元素的前一个元素作为比较对象
#开始比较,一直当前元素与上一个元素比较如[1, 4, 2, 8, 5],则1和4比较,4和2比较...
满足条件:
#让当前值,更新为下一个值比较的key值
再判断:
#由题,如果不满足不下降子序列,可以调整k次
#调整后,是与上一个数相等,如4和2比较后,2小于4,则调整2为4即[1, 4, 4, 8, 5],
#由于此时,调整后与上一个key值一样,其实这条语句可以删掉,这为了更好理解
否则:
#不满足条件,且k次调整机会没有了,以i开始的一轮结束,退出
end:
#如果以这次i开始的一轮,得出的长度大于之前统计的最长长度,则更新
#蓝桥杯2022年第十三届省赛真题,不下降子序列
n,k = map(int,input().split())
ll = list(map(int,input().split()))
n,m,ll
# 样例输入
# 5 1
# 1 4 2 8 5
# 样例输出
# 4
maxx = 1#用以保存最长不下降序列的长度
count = 1#作为每次不下降序列长度的计数
#从下标为1的元素,第二个元素开始
for i in range(1,len(ll)):
count = 1#初始化count
if maxx >= len(ll)-i:#如果剩下序列少于当前最长序列,则退出,说明就算剩下全是不下降序列也不能更新答案,没有继续的必要
break
#将当前元素的前一个元素作为比较对象
key = ll[i-1]#作为后面数比较的对象,验证是否为不下降序列
#开始比较,一直当前元素与上一个元素比较如[1, 4, 2, 8, 5],则1和4比较,4和2比较...
for j in range(i,len(ll)):
if ll[j] >= key:
count += 1#计数器增加1
key = ll[j]#让当前值,更新为下一个值比较的key值
elif k > 0:#由题,如果不满足不下降子序列,可以调整k次
#调整后,是与上一个数相等,如4和2比较后,2小于4,则调整2为4即[1, 4, 4, 8, 5],
count += 1#计数器增加1
k -= 1#调整次数减一
key = ll[j-1]#由于此时,调整后与上一个key值一样,其实这条语句可以删掉,这为了更好理解
else:#不满足条件,且k次调整机会没有了,以i开始的一轮结束,退出
break
#如果以这次i开始的一轮,得出的长度大于之前统计的最长长度,则更新
if count > maxx:#看不下降序列最长,长度是否需要更新
maxx = count
#输出
print(maxx)
# 样例输入
# 5 1
# 1 4 2 8 5
# 样例输出
# 4