蓝桥杯训练:小蓝的零花钱(Java解法)

小蓝和小桥正在玩一个游戏,他们有一个长度为n的序列,其中既有偶数也有奇数,且偶数和奇数的数量相等。

小蓝有一些零花钱,他可以用这些钱来做一个特殊的操作:他在序列中选取一个位置,然后在这个位置上将序列分成两段,要求每一段中偶数和奇数的数量都相等。小蓝想要用他的零花钱尽可能多地进行这个操作,但每次操作都需要花费代价。具体而言,每次选取的位置可以看成是对序列进行切割,切割需要花费的代价为切割两端的元素的差的绝对值。小蓝想知道,在他的预算范围内,最多能进行多少次操作。

请你帮助小蓝计算最多可以进行的操作次数。

import java.util.Arrays;
import java.util.Scanner;

public class 小蓝的零花钱 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();  //定义序列长度
        int[] arr = new int[n];
        int money = sc.nextInt();  //定义零花钱钱的个数
        for (int i = 0; i < n; i++) {  //给序列赋值
            arr[i] = sc.nextInt();
        }
        int[] array = new int[n];  //定义一个数组收集每个切割点所需要的价格
        int sum = 0;
        int index = 0; //切割点价格数组的索引
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] % 2 == 1)
                sum++;
            else
                sum--;
            //当sum = 0时说明切割点左序列奇偶个数相等
            if (sum == 0 && i + 1 < n){   //i < n - 1是因为i最多只能到倒数第三个元素
                array[index++] = Math.abs(arr[i] - arr[i + 1]);  //出现切割点时,将价格赋值给数组
            }
        }
        Arrays.sort(array,0,index);  //顺序排序可以切割位置需要的价钱
        int count = 0;  //定义一个计数器记录可以切割的次数
        for (int i = 0; i < index; i++) {
            if (money >= array[i]){
                money -= array[i];
                count++;
            }
            else
                break;
        }
        System.out.print(count);
    }
}
  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值