题目:
分析:
本质上就是去求,小蓝的零花钱B,最多能够花几次。
每次花的钱等于一个奇偶数数量相等的数列里某两个相邻的值的差
所以为了最大化花的次数,我们就要最小化每次花的钱。
所以总的思路:
1. 判断输入的这个数列是否为奇偶数数量相等的数量
2. 如果是,将该数列里的每个元素与上一个元素的差添加进一个数列
3. 将差的数列排序,从最小的差开始减,直到零钱为0即可。
正确的代码如下:
n , B = map(int, input().split())
list = list(map(int, input().split()))
cnt = 0 # 记录从左到右起的奇偶数之差,当为零两边的奇偶数一样,否则不一样
res = [] # 记录分割时,两端的差值
for i in range(n-1):
if list[i] % 2 == 0:
cnt += 1
else:
cnt -= 1
if cnt == 0:
res.append(abs(list[i] - list[i+1]))
res.sort() # 将存储的差值进行排序,尽可能的多进行操作
ans = 0 # 记录操作次数
for i in res:
if B > i: # 当预算不够时,就退出操作
B -= i
ans += 1
else:
break
print(ans)
几个要注意的点:
1. 判断数列是否奇偶数数量相等时,引入一个参数,遍历每个元素,遇到偶数+1,遇到奇数-1,最终看这个参数的值是否为0即可
2. 不要读错题意,不需要去找到小蓝是在哪个索引划分的!我们真正要找的只是为了满足小蓝的零花钱最大化,满足这个条件就足够了!
3. 数列是题目给好的,不需要在代码过程中再创造一个