题目描述
对于给定的一个长度为NN的正整数数列AiAi,现要将其分成连续的若干段,并且每段和不超过MM(可以等于MM),问最少能将其分成多少段使得满足要求。
输入输出格式
输入格式:
第1行包含两个正整数N,MN,M,表示了数列AiAi的长度与每段和的最大值,第22行包含NN个空格隔开的非负整数AiAi,如题目所述。
输出格式:
一个正整数,输出最少划分的段数。
输入输出样例
输入样例:
输出样例:
算法思想
求最少分段数,我们可以从分一段到分N段进行寻找,当找到符合的直接退出循环,输出最少分段数。
import java.util.Scanner;
public class ArrayBlock {
public static int[] array, flag; //array保存输入数列, flag保存数组被分段的段号标志
public static int n, value; //n,value为输入n个数据和受到value的限制分段
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
n = in.nextInt();
value = in.nextInt();
array = new int[n];
flag = new int[n];
for (int i = 0; i < n; i ++) {
array[i] = in.nextInt();
}
circulate: for (int i = 1; i < n; i ++) {
for (int j = 0; j < Math.pow(i, n); j ++) { //便利分i段数列被分到不同序号段中的所有情况
int copyJ = j;
for (int k = 0; k < n; k ++, copyJ /= i) { //更新标志数组flag
flag[k] = copyJ % i;
}
if(check(i)) { //检查是否分段正确
System.out.println(i);
break circulate;
}
}
}
}
public static boolean check(int num) {
int[] sum = new int[num];
for (int i = 0; i < flag.length; i ++) { //计算每一段的和
sum[flag[i]] += array[i];
}
for (int i = 0; i < num; i ++) {
if (sum[i] > value)
return false;
}
return true;
}
}