【例题】lanqiao3236 小蓝的零花钱

在这里插入图片描述
样例输入

6 3
1 2 3 4 5 6

样例输出

2

解题思路

  • 在序列中选取一个位置将序列分成两段,要求每一段中偶数和奇数的数
  • 量都相等尽可能多地进行这个操作,但每次操作都需要花费代价
  • 切割需要花费的代价为切割两端的元素的差的绝对值
  • 在他的预算范围内,最多能进行多少次操作。

通过计算每一种可能的切割的消耗,并把它们列表,按照升序排列,然后用零花钱总数去减,使能减更多次。

代码

n,B=map(int,input().split())
a=list(map(int,input().split()))
#记录奇数和偶数的数量差
cnt = 0
#记录相邻两个数之差的绝对值
cost = []
#求出序列里奇数个数=偶数的所有可能切法并求消耗
for i in range(0,n-1):
    if a[i] % 2 ==0:
        cnt += 1
    else:
        cnt -= 1
    # 保证序列里奇数个数=偶数
    if cnt == 0:
        cost.append(abs(a[i]-a[i+1]))
#把差的绝对值排序,让B从小减到大以求最多操作次数
cost.sort()
res = 0
for i in cost:
#B从小减到大,减到余额不足时跳出          
    if B >= i:
        res +=  1
        B -= i
    else:
        break

print(res)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值