python蓝桥杯省赛真题,不下降子序列

 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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值