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

sx618788 组合题 共 个子题

(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;
}

子题 单选题

①处应填( )

A

c - (c < '9' ? '0' : 'A' - 10)

B

c - (c < 'A' ? '0' : 'A' - 10)

C

c - (c < 'A' ? 'A' - 10 : '0')

D

c - (c < 'A' ? '0' : 'A' + 10)

子题 单选题

②处应填( )

A

int r = 1 + l; r <= n; ++r

B

int r = l; r < n; ++r

C

int r = l; r <= n; r += 2

D

int r = l; r <= n; ++r

子题 单选题

③处应填( )

A

sum / (r - 1 + 1) * 1.0

B

sum * 1.0 / (r - l) + 1

C

sum * 1.0 / (r - l + 1)

D

(sum - a[r]) * 1.0 / (r - l + 1)

子题 单选题

④处应填( )

A

r + 1, cnt + (r < n), min(mnb, nwb), max(mxb, nwb)

B

r + 1, cnt + (r <= n), min(mnb, nwb), max(mxb, nwb)

C

r + 1, cnt + (r < n), max(mnb, nwb), min(mxb, nwb)

D

r + 1, cnt + (r <= n), max(mnb, nwb), min(mxb, nwb)

子题 单选题

⑤处应填( )

A

0, 0, 1e100, -1e100

B

0, 0, -1e100, 1e100

C

1, 0, -1e100, 1e100

D

1, 0, 1e100, -1e100

正在加载题目数据…
已答 /
子题
该题型需在试卷/作业中作答,单题练习暂不支持
答案解析
讨论
发布
登录后参与讨论 立即登录
发布讨论需先绑定并验证手机号 去绑定手机号
加载中…
我
我
回复 @
回复 @
发送
还没有人讨论,来发表第一条吧