资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
有N根木棍,需要将其粘贴成M个长木棍,使得最长的和最短的的差距最小。
输入格式
第一行两个整数N,M。
一行N个整数,表示木棍的长度。
输出格式
一行一个整数,表示最小的差距
样例输入
3 2
10 20 40
样例输出
10
数据规模和约定
N, M<=7
思路:
每次合并时只考虑两个元素的合并,合并后的元素再次加入数组中,等待下次合并。
由n, m知,需要合并的次数为 n - m次,即需要减少的元素个数。
合并两个元素后,删除多余的元素,把它和末尾的元素交换,然后进入下层的时候 u - 1,就可以了。回溯只要交换回来,并把合并元素减去它就行。
注意:
max(a,b),返回a,b两者之间的较大值
*max_element(r, r+6),返回数组r中[0, 6)之间的最大值
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int n, m;
int ans = 9999;
int arr[7] = {0};
void dfs(int u) {
if (u == m) {
int min1 = *min_element(arr, arr + m);
int max1 = *max_element(arr, arr + m);
ans = min(ans, max1 - min1);
return;
}
for (int i = 0; i < u; i++) {
for (int j = i + 1; j < u; j++) {
arr[i] += arr[j];
swap(arr[j], arr[u - 1]);
dfs(u - 1);
swap(arr[j], arr[u - 1]);
arr[i] -= arr[j];
}
}
}
int main(){
cin >> n >> m;
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
dfs(n);
cout << ans << endl;
return 0;
}