ABC337E Bad Juice 题解
Analysis
结论:
- 最少需要询问的人数是 \(\log_2(n-1)+1\)。
- 第 \(i\) 个人喝的饮料的编号在二进制下的第 \(i\) 位是 \(1\)。
把饮料的编号记作二进制,第 \(i\) 个人喝第 \(i\) 位是 \(1\) 的饮料。这样回答的字符串中,如果第 \(i\) 个人生病了,说明有毒的饮料的编号的第 \(i\) 位是 \(1\)。因此至少需要 \(\lceil \log_2 n \rceil\) 个人。当 \(2^m=n\) 的时候,可能会出现没有人生病的情况,说明 \(n\) 号饮料有毒。
Code
cin >> n;
m = __lg(n - 1) + 1;
cout << m << "\n";
for (int i = 0; i < m; i++) {
int K = 0;
for (int j = 1; j <= n; j++) {
if ((j >> i) & 1) K++;
}
cout << K << " ";
for (int j = 1; j <= n; j++) {
if ((j >> i) & 1) cout << j << " ";
}
cout << "\n";
}
fflush(stdout);
cin >> s;
for (int i = 0; i < m; i++) {
if (s[i] == '1') ans |= (1 << i);
}
if (ans == 0) ans = n;
cout << ans << "\n";
fflush(stdout);

浙公网安备 33010602011771号