蓝桥杯 试题 算法训练 粘木棍 JAVA实现
资源限制
内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
问题描述
有N根木棍,需要将其粘贴成M个长木棍,使得最长的和最短的的差距最小。
输入格式
第一行两个整数N,M。
一行N个整数,表示木棍的长度。
输出格式
一行一个整数,表示最小的差距
样例输入
3 2
10 20 40
样例输出
10
数据规模和约定
N, M<=7
2.代码如下
public class Main {
static int minjian=Integer.MAX_VALUE;
static int n;
static int m;
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
n=scanner.nextInt();//n根棍子
m=scanner.nextInt();//粘成m根
int sticks[]=new int[n];
int min=Integer.MAX_VALUE;
int max=Integer.MIN_VALUE;
for (int i = 0; i < n; i++) {
sticks[i]=scanner.nextInt();
min=Math.min(min, sticks[i]);
max=Math.max(max, sticks[i]);
}
if(n==m)
{
System.out.println(max-min);
}
else if(m==1)
{
System.out.println(0);
}
else
{
int sumstick[]=new int[m+1];
dfs(sticks, 0, sumstick);
System.out.println(minjian);
}
}
static void dfs(int stick[],int index,int sums[])
{
if(index==n)
{
//sums数组中的最大差
int min=Integer.MAX_VALUE;
int max=Integer.MIN_VALUE;
for(int i=1;i<=m;i++)
{
int num=sums[i];
min=Math.min(min, num);
max=Math.max(max, num);
}
minjian=Math.min(minjian, max-min);
return;
}
for (int i = 1; i <=m; i++)
{
sums[i]+=stick[index];
dfs(stick, index+1, sums);
sums[i]-=stick[index];
}
}
}