组合题5 个小题
已作答 0 / 5
给定一个长度为 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 个数的平均值,记作 bi。你的目标是使 b0,b1,…,bk 中最大值与最小值之差尽可能小,并输出这个最小值。
其中 2≤n≤20。输入字符串中的字符只可能是 0—9 或 A—F。本题假定字符采用 ASCII 编码。输出答案时保留小数点后 6 位。
以下程序通过递归枚举所有可能的连续分段方案。请补全程序。
1#include <algorithm>2#include <iomanip>3#include <iostream>4 5using namespace std;6 7constexpr int N = 25;8 9int n, a[N];10char s[N];11 12double ans = 1e100;13 14int value(char c) { return /* ① */; }15 16void split(int l, int cnt, double mnb, double mxb) {17 if (l > n) {18 if (cnt == 0) return;19 ans = min(ans, mxb - mnb);20 return;21 }22 int sum = 0;23 for (/* ② */) {24 sum += a[r];25 double nwb = /* ③ */;26 split(/* ④ */);27 }28}29 30int main() {31 cin >> n >> s + 1;32 for (int i = 1; i <= n; ++i)33 a[i] = value(s[i]);34 split(/* ⑤ */);35 cout << fixed << setprecision(6) << ans;④处应填( )。