第39286题 组合题
完善程序(第二题):平衡分割——连续分段平均值的极差最小化

(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;
}
{{ option.label }}
子题{{ index + 1 }} {{ child.type_label }}
{{ option.label }}
✓ 正确 ◐ 部分正确 ✗ 错误
程序运行统计
暂无判题统计
知识点:
提交{{ questionInfo.stats ? questionInfo.stats.submit_count : 0 }}次 正确率{{ statsAccuracy }}%
答案解析