蓝桥杯A组——Python(10.07)Day9

蓝桥杯A组——Python(10.07)Day9

  • 今天开始进入第三周W3——begin

W3T1-最优清零方案:

   给定一个长度为N的数列A1,A2,···,AN。现在小蓝想通过若干次操作将这个数列中每个数字清零。
   每次操作小蓝可以选择以下两种之一
1、选择一个大于0的整数将它减去1;
2、选择连续K个大于0的整数将它们各减去1。
   小蓝最少经过几次操作可以将整个数列清零?
  【输入格式】
输入第一行包含两个整数N和K
第二行包含N个整数A1,A2,···,AN。

  • 遍历每次取a[i:i+k]的最小值。
  • 如果这个最小值不为0则ans加上这个最小值。同时a[i,i+k]都减去这个最小值。
  • 再遍历a[i,i+k]找到找到最后一个为0的值的下标,令i等于这个下标。
  • 最后的ans还要加上sum(a)
import sys
readline = sys.stdin.readline
read = lambda:[int(x) for x in readline().split()]
n,k = read()
a = [0] + read()
i = 1
ans = 0
while i<=n:
    if i+k-1<=n:
        mina = min(a[i:i+k])
        if mina!=0:
            ans += mina
            for t in range(i,i+k):
                a[t]-=mina
        for t in range(i+k-1,i-1,-1):
            if a[t]==0:
                i=t
                break
    i += 1
ans += sum(a)
print(ans)


W3T2-最长不下降子序列:

   最长不降序列长度的查找 最长不下降子序列是指序列中的一个子序列,子序列中的每个数不小于在它之前的数。 【输入格式】
   输入第一行包含N个整数A1, A2,···,An。

  • 用二分查找来降低时间复杂度
#定义lens函数实现最长不降序列长度的查找(不是连续)
def lens(nums):
    if not nums:
        return 0
    tails = []
    for num in nums:
        # 二分查找应该插入的位置
        index = binary_search(tails, num)
        if index == len(tails):
            tails.append(num)
        else:
            tails[index] = num

    return len(tails)

def binary_search(tails, num):
    left, right = 0, len(tails)
    while left < right:
        mid = (left + right) // 2
        if tails[mid] < num:
            left = mid + 1
        else:
            right = mid
    return left
nums = list(map(int, input('请输入序列用空格分开').split()))
print(lens(nums))
  • 第一次写的时候没看清楚题目,以为是连续的😭

————————————————————————————————————————
   明天要开始上课了,又要挤时间了,忙碌但充实,加油💪

W3(D9)——end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值