题目传送门:“蓝桥杯”练习系统 (lanqiao.cn)
代码:
贪心:
// 贪心
#include<bits/stdc++.h>
using namespace std;
int val[10], arr[10]; // arr[i] 记录第i根合成木棍的长度
int main() {
int n, m;
cin >> n >> m;
for(int i = 1; i <= n; i++) cin >> val[i];
sort(val + 1, val + n + 1);
for(int i = n, j = 1; j <= m; i--, j++) {
arr[j] = val[i];
}
for(int i = n - m; i >= 1; i--) {
sort(arr + 1, arr + m + 1);
arr[1] += val[i];
}
sort(arr + 1, arr + m + 1);
cout << arr[m] - arr[1] << '\n';
return 0;
}
dfs:
//dfs
#include<bits/stdc++.h>
using namespace std;
int val[10], st[10], arr[10]; // st[i] 记录第i根木棍是否使用过 arr[i] 记录第i根合成木棍的长度
int n, m, Minans = 1e9 + 7;
void dfs(int cnt) {
if(cnt == n + 1) {
int Max = -1, Min = 1e9 + 7;
for(int i = 1; i <= m; i++) {
if(arr[i] > Max) Max = arr[i];
if(arr[i] < Min) Min = arr[i];
}
Minans = min(Minans, Max - Min);
return;
}
for(int i = 1; i <= n; i++) {
if(!st[i]) {
for(int j = 1; j <= m; j++) {
st[i] = j;
arr[j] += val[i];
dfs(cnt + 1);
arr[j] -= val[i];
}
st[i] = 0;
}
}
return;
}
int main() {
cin >> n >> m;
for(int i = 1; i <= n; i++) cin >> val[i];
if(m == 7) {
sort(val + 1, val + m + 1);
cout << val[m] - val[1];
} else {
dfs(1);
cout << Minans << '\n';
}
return 0;
}