②处应填( )
(2) (平衡分割) 给定一个长度为 n 的字符串,其中每个字符都是一个十六进制数位。例如,字符串 016A 表示十进制下的四个数 0、1、6、10。 现在请选择 k 个(k 是你选定的数)切分位置 (p1, p2 ...., pk),其中 (1 <= k < n),且 (1 <= p1 <p2 < .... < pk < n)。再令 (p0 = 0),(pk+1 = n)。 对于每个 (0 <= i <= k),计算第 (pi+ 1) 个数到第 (pi+1) 个数的平均值,记作 (b_i)。你的目标是使 (b0, b1, ..., bk) 中最大值与最小值之差尽可能小,并输出这个最小值。 其中 (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;
}
int r = l + 1; r <= n; ++r
int r = l; r < n; ++r
int r = l; r <= n; r += 2
int r = l; r <= n; ++r