蓝桥杯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