④处应填( )。
有 n 名学生参加了一场考试,考试共有 m 道选择题,每道题只有 A、B 两个选项。第 i 名学生的作答是一个长度为 m 的字符串。若最终公布的标准答案与该学生在某道题的答案相同,则该学生在该题上得 1 分,否则不得分。记第 i 名学生最终得到的总分为 ri。第 i 名学生给出的预估分数为 xi。现在需要构造一份标准答案,使尽可能大。数据满足:1 <= n <= 20,1 <= m <= 300,0 <=xi<= m。
下面从另一个角度处理,把它写成更易优化的形式;对于非负整数x,__builtin_ctzll(x) 返回 x 的二进制表示末尾连续 0 的个数; __builtin_popcountll(x) 返回 x 的二进制表示中 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;
}
2ll * s[k] * c[k]
s[k] * c[k]
2ll * (s[k] - c[k])
2ll * c[k]