← 查看本卷题目
组合题5 个小题
已作答 0 / 5

给定一个长度为 nn 的字符串,其中每个字符都是一个十六进制数位。例如,字符串 016A 表示十进制下的四个数 0,1,6,100, 1, 6, 10。

现在请选择 kk 个(kk 是你选定的数)切分位置 p1,p2,…,pkp_{1}, p_{2}, … , p_{k},其中 1≤k<n1 \le k < n,且 1≤p1<p2<⋯<pk<n1 \le p_{1}< p_{2}< \cdots < p_{k}< n。再令 p0=0p_{0}=0,pk+1=np_{k + 1}=n。

对于每个 0≤i≤k0 \le i \le k,计算第 pi+1p_{i} + 1 个数到第 pi+1p_{i + 1} 个数的平均值,记作 bib_{i}。你的目标是使 b0,b1,…,bkb_{0}, b_{1}, … , b_{k} 中最大值与最小值之差尽可能小,并输出这个最小值。

其中 2≤n≤202 \le n \le 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;
第 40 题单选题原卷 3 分

②处应填( )。

填写答案