(2)(平衡分割)给定一个长度为 n 的字符串,其中每个字符都是一个十六进制数位。例如,字符串 016A 表示十进制下的四个数 0、1、6、10。 现在请选择 k 个(k 是你选定的数)切分位置 p1、p2、…、pk,其中 1 ≤ k < n,且 1 ≤ p1 < p2 < … < pk < n。再令 p0 = 0,p_{k+1} = n。 对于每个 0 ≤ i ≤ k,计算第 pi + 1 个数到第 p{i+1} 个数的平均值,记作 b_i。你的目标是使 b_0、b_1、…、b_k 中最大值与最小值之差尽可能小,并输出这个最小值。 其中 2 ≤ n ≤ 20。输入字符串中的字符只能是 0 ~ 9 或 A ~ F。本题假定字符串采用 ASCII 编码。输出答案时保留小数点后 6 位。 以下程序通过递归枚举所有可能的连续分段方案。请补全程序。
#include <algorithm>
#include <iomanip>
#include <iostream>
using namespace std;
constexpr int N = 25;
int n, a[N];
char s[N];
double ans = 1e100;
int value(char c) { return ____①____; }
void split(int l, int cnt, double mnb, double mxb) {
if (l > n) {
if (cnt == 0) return;
ans = min(ans, mxb - mnb);
return;
}
int sum = 0;
for (____②____) {
sum += a[r];
double nwb = ____③____;
split(____④____);
}
}
int main() {
cin >> n >> s + 1;
for (int i = 1; i <= n; ++i)
a[i] = value(s[i]);
split(____⑤____);
cout << fixed << setprecision(6) << ans;
return 0;
}