超时一组,蓝桥杯只有90分
资源限制
内存限制: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
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <numeric>
using namespace std;
int n, m;
int stick[10], stick_plus[10], state[10];
int min_long = 114514;
int measure()
{
int min_=stick_plus[0], max_=stick_plus[0];
for(int i=0; i<m; i++)
{
if(stick_plus[i] > max_)
max_ = stick_plus[i];
if(stick_plus[i] < min_)
min_ = stick_plus[i];
}
return max_ - min_;
}
void dfs(int idx)
{
int flag;
if(idx == n)
{
flag = measure();
if(flag < min_long)
min_long = flag;
return ;
}
for(int i=0; i<n; i++)
{
if(state[i]) continue;
state[i] = 1;
for(int j=0; j<m; j++)
{
stick_plus[j] += stick[i];
dfs(idx + 1);
stick_plus[j] -= stick[i];
}
state[i] = 0;
}
return ;
}
int main()
{
cin>>n>>m;
for(int i=0; i<n; i++)
cin>>stick[i];
dfs(0);
cout<<min_long;
return 0;
}