小蓝和小桥正在玩一个游戏,他们有一个长度为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);
}
}