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

给定 nn 名学生参加一场考试,考试共有 mm 道选择题,每道题只有 A、B 两个选项。

第 ii 名学生的作答为一个长度为 mm 的字符串。若最终公布的标准答案与该学生在某道题上的作答相同,则该学生在这道题上得 1 分,否则不得分。记第 ii 名学生最终得到的总分为 rir_{i}。

每名学生还有一个预期得分 xix_{i}。现在需要构造一份标准答案,使

尽可能大。

数据满足 1≤n≤181 \le n \le 18,1≤m≤3001 \le m \le 300,0≤xi≤m0 \le x_{i}\le m。

提示:可以换一个角度处理 ∑i=1n∣ri−xi∣\sum_{i=1}^{n}∣r_{i}- x_{i}∣,把它写成更易优化的形式;对正整数 xx,__builtin_ctzll(x) 返回 xx 的二进制表示末尾连续 0 的个数;__builtin_popcountll(x) 返回 xx 的二进制表示中 1 的个数。

以下程序构造出一组满足要求的标准答案。请补全程序。

#include <cstdlib>#include <iostream>#include <string>#include <vector>using namespace std;typedef long long ll;typedef unsigned long long ull;int main() {    int n, m;    cin >> n >> m;    vector<ll> x(n), c(n);    for (int i = 0; i < n; i++) {        cin >> x[i];        c[i] = /* ① */;    }    vector<string> a(n);    for (int i = 0; i < n; i++)        cin >> a[i];    vector<int> s(n, -1);    vector<ll> q(m, 0);    ll C = 0, S = 0;    for (int i = 0; i < n; i++) {        C -= c[i];        for (int j = 0; j < m; j++) {            if (a[i][j] == 'A') q[j]--;            else q[j]++;        }    }    for (int j = 0; j < m; j++) S += abs(q[j]);    ll ans = C + S;    ull best = 0, lst = 0;    for (ull mask = 1; mask < (1ULL << n); mask++) {        ull g = /* ② */;        ull d = g ^ lst;        int k = /* ③ */;        C -= /* ④ */;        for (int j = 0; j < m; j++) {            ll old = q[j];            int v = (a[k][j] == 'A' ? 1 : -1);            q[j] -= 2ll * s[k] * v;            S += abs(q[j]) - abs(old);        }        s[k] = -s[k];        if (C + S > ans) {            ans = C + S;            best = g;        }        lst = g;    }    for (int i = 0; i < n; i++) {        if ((best >> i) & 1) s[i] = 1;        else s[i] = -1;    }    string res(m, 'A');    for (int j = 0; j < m; j++) {        ll v = 0;        for (int i = 0; i < n; i++) {            if (a[i][j] == 'A') v += s[i];            else v -= s[i];        }        if (/* ⑤ */) res[j] = 'A';        else res[j] = 'B';    }    cout << res << endl;    return 0;}
第 41 题单选题原卷 3 分

③处应填( )。

填写答案