ABC337E Bad Juice 题解

题目链接

Analysis

结论:

  • 最少需要询问的人数是 log2(n1)+1
  • i 个人喝的饮料的编号在二进制下的第 i 位是 1

把饮料的编号记作二进制,第 i 个人喝第 i 位是 1 的饮料。这样回答的字符串中,如果第 i 个人生病了,说明有毒的饮料的编号的第 i 位是 1。因此至少需要 log2n 个人。当 2m=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);
posted @   Unino  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示