“1000瓶药水,其中至多有1瓶剧毒,小狗服完药20小时后才能判断是否中毒。现在给你10只小狗、在24小时内、通过小狗试药的方式找出哪瓶药有毒或者全部无毒”

【思维与逻辑】有1000瓶药水,但其中有一瓶毒药水,需要多少只小白鼠? 【笔试题】有1000瓶药水,但其中有一瓶毒药水,需要多少只小白鼠? 文章目录【笔试题】有1000瓶药水,但其中有一瓶毒药水,需要多少只小白鼠?1、 题目描述2、 分析思路 1、 题目描述   现有1000瓶药水其中有一瓶是毒药水,现需要提供多少只小白鼠才能检测那一瓶毒药水?(使用尽可能少的实验小白鼠) 2、 分析思路   因为2^10=1024,故提供10只小白鼠就可以检测出那一瓶毒药水。   首先对1000瓶药水进行编号1~1000,10只小白鼠进行标记1至10号,对10只小白鼠分别灌入药水,1号药水 阅读详情

题目:

1000瓶药水,其中至多有1瓶剧毒,小狗服完药20小时后才能判断是否中毒。

现在给你10只小狗、在24小时内、通过小狗试药的方式找出哪瓶药有毒或者全部无毒

思路:
一、“小狗服完药20小时后才能判断是否中毒”,现只有“24小时内”,那么只能试一轮。

二、一轮过后,每只小狗状态有两种:生、死
    把每只狗看成二进制数的一位,那么结果是个10位的二进制数,可表示2^10 即1024种情况
    这已经超过了目标总数(1000),因此有可能找到一种编码方案,将1000种情况唯一的表现出来。

三、将1000瓶药编号:1~1000,换成2进制:0000000001至1111101000(称最左边为第9位,最右边为第0位)
  再取10个试管,编号:9876543210
  对每瓶药,查它2进制编号中所有为1的位,按位序号加到对应试管中。

  例如第1000瓶药的编号为1111101000,加入第9,8,7,6,5,3号试管。

  然后对狗编号,吃下对应试管的药(混合后的)。

四、20小时后,根据狗的情况:生=0,死=1 得到一个10位2进制数,即毒药的编号。

以下为测试程序:

#include <cassert>
#include <cstdlib>
#include <cstring>
#include <iostream>
using namespace std;

class Tester
{
  bool  m_began;
  int   m_poison;
  bool  m_dogs[10];

public:
  Tester()
    : m_began(false)
  {
    this->begin();
    this->end();
  }

  void begin(int i = -1)
  {
    m_began = true;
    memset(m_dogs, 0, sizeof(m_dogs));
    m_poison = (i == -1 ? (rand() % 1000) + 1 : i);
  }

  void feed(int dog0to9, int bottle1to1000)
  {
    assert(m_began);
    if(bottle1to1000 == m_poison){
      m_dogs[dog0to9] = true;
    }
  }

  void end()
  {
    m_began = false;
  }

  bool query(int dog0to9)
  {
    assert(!m_began);
    return m_dogs[dog0to9];
  }

  void judge(int poison)
  {
    assert(!m_began);
    if(m_poison != poison){
      cerr << "test failed: estimate " << poison << ", fact " << m_poison << endl;
      exit(0);
    }
  }
};

void testCase(Tester & t, int x = -1)
{
  t.begin(x);
  for(int i = 1; i <= 1000; ++i){ // for each bottle
    for(int x = i, n = 0; x; x >>= 1, ++n){ // each bit
      if(x & 1){
        t.feed(n, i);
      }
    }
  }

  t.end();
  int id = 0;
  for(int i = 9; i >= 0; --i){
    id = (id << 1) | (t.query(i) ? 1 : 0);
  }

  t.judge(id);
}

int main()
{
  Tester t;

  // cover
  for(int x = 0; x < 1001; ++x){
    testCase(t, x);
  }

  // random test
  for(int x = 0; x < 100; ++x){
    testCase(t);
  }

  cout << "passed" << endl;

  return 0;
}


C#上位机+YOLO实战:从环境搭建到实现首个目标检测(零基础入门) / YOLOv8的类别名称(共80类,对应COCO数据集)// ONNX推理会话// YOLOv8的输入宽度// YOLOv8的输入高度本文从技术选型、环境搭建到代码实现,详细介绍了如何将C#上位机与YOLOv8结合,实现基础的目标检测功能。整个过程避开了常见的坑点,同时对核心原理和代码逻辑进行了详细解析,希望能帮助零基础的开发者快速入门。实际上,C#上位机+YOLO的组合在工业领域有非常广泛的应用,本文的案例只是一个起点。 阅读详情

相关推荐

从维纳滤波到Richardson-Lucy:图像去模糊算法的原理与实践

本文深入解析了图像去模糊的核心原理,重点对比了维纳滤波与Richardson-Lucy两种经典去卷积算法。维纳滤波在频域进行快速权衡,适用于高斯噪声场景;而Richardson-Lucy算法基于泊松噪声模型迭代优化,更适用于天文、显微等科学成像。文章通过Python代码实践,详细阐述了PSF(点扩散函数)的关键作用及算法选型指南。

weixin_29285605的博客 385

“1000瓶药水,其中至多有1瓶剧毒,小狗服完药20小时后才能判断是否中毒。现在给你10只小狗、在24小时内、通过小狗试药的方式找出哪瓶药有毒或者全部无毒”...

题目: 1000瓶药水,其中至多有1瓶剧毒,小狗服完药20小时后才能判断是否中毒。 现在给你10只小狗、在24小时内、通过小狗试药的方式找出哪瓶药有毒或者全部无毒 思路: 一、“小狗服完药20小时后才能判断是否中毒”,现只有“24小时内”,那么只能试一轮。 二、一轮过后,每只小狗状态有两种:生、死 把每只狗看成二进制数的一位,那么结果是个10位的二进制数,可表示2^10 即1024种...

数据库天地 824

车辆贷款违约预测挑战赛

2021科大讯飞-车辆贷款违约预测挑战赛--方案简介车贷违约预测问题,目的是建立风险识别模型来预测可能违约的借款人。预测结果为借款人是否可能违约,属于二分类问题。偏数据挖掘的比赛,关键点是如何基于对数据的理解抽象归纳出有用的特征。站在大佬的视角,尝试学习总结,站在巨人的肩膀上,也许看得会更远一些。直接进入主题,开始学习套路,芜湖~特征工程1、常用库、数据导入import pandas as pd import numpy as np import lightgbm as lgb import xgboost

平平淡淡,戒急用忍,一生学闭嘴。 3341

关于10只狗测1000瓶药水有毒无毒的问题

题目:有1000瓶药水,其中至多有1瓶有毒。有10只狗,每只狗喝下药水若是有毒会在40分钟之内死亡。现需要在1个小时之内测出哪瓶药水有毒。 1.首先给十只狗分别编号0----9,给1000瓶药水分别标号1----1000 2.将药水编号的二进制写出来(7号药水(00 0000 0111)我们取低十位因为有十只狗,而一共有1024种表示足够1000瓶药水编号)给二进制中对应位1的编号的狗喝药水。

去南极的蚂蚁的专栏 1429

FPGA设计中的扇出约束实战:从XDC到代码优化的全流程解析

本文全面解析FPGA设计中扇出约束的重要性与应用,详细介绍了从XDC约束文件设置到HDL代码优化的全流程实战技巧。通过MAX_FANOUT约束控制信号负载,结合寄存器复制和物理优化策略,有效解决高扇出导致的时序违例和布线拥塞问题,提升设计性能和可靠性。

nept的博客 796

【2025年美团春招(算法岗)-3月15日-第三题(300分)- 字符串权值】(题目+思路+Java&C++&Python解析+在线测试)

小美定义一个字符串的权值为:其长度为3的回文子序列数量。例如,“abca"的权值为2,因为包含两个回文子序列"aba"和"aca现在给定一个仅包含小写字母的字符串,小美希望你输出该字符串每个前缀的权值。

m0_73659489的博客 312

1000瓶试剂,其中一瓶有毒,最少需要多少只小白鼠能找出有毒的试剂

题目: 1000瓶试剂,其中有1瓶有毒,如果小白鼠服用有毒的药,则24小时后死亡。要求使用尽可能少的小白鼠,在24小时内找出有毒的药。思路: 这是一道典型的二分法查找的算法题,一般情况下,我们使用的都是串行的二分法,如果这道题没有时间限制,我们就可以使用串行的二分法找到毒药,步骤如下: (1)首先,给试剂编号,1~1000 (2

sinat_28028941的博客 1万+

基于Abaqus的横向各向同性线弹性理想塑性材料模型的umat子程序实现——以Fortran为例,带您揭秘弹性塑性模型编程之道

通过以上步骤,我们已经在Abaqus中使用Fortran实现了横向各向同性线弹性理想塑性材料模型的umat子程序。在实际应用中,我们需要根据具体的材料特性和加载条件来调整模型参数和计算过程。尽管我在这篇文章中尽力提供了详细的教程,但由于我自身的知识限制和经验不足,可能会有误解或错误。我希望大家在学习过程中能多思考,多实践,多交流,以更好地理解和掌握这个主题。

qq_38334677的博客 1690

1000瓶药水,1瓶有毒药,几只小白鼠能够找出?

1000瓶药水,1瓶有毒药,几只小白鼠能够找出?条件:问题:解答:第二种变体第三种变体 原文链接: https://www.jianshu.com/p/607d6683748b 条件: 现有1000瓶药,其中有一瓶毒药,喝了之后1小时后才产生效果,现在你有10只老鼠和1个小时的时间,请问怎么找出毒药? 问题: 现在给1周的时间,用10只老鼠找出1千瓶水中的那瓶水。 解答: 思路: 老鼠被喂药后,...

噜噜噜 4380

RK3568平台开发系列讲解(NPU篇)什么是RKNPU

📢本篇章将介绍RKNPU。

内核笔记 4354

【C++/嵌入式梳理】bootloader

【C++/嵌入式笔试面试八股】bootloader

Hi 1210

腾讯08年招聘面试题(以狗试毒)(转)

1、1000瓶药水,其中至多有1瓶剧毒,现在给你10只小狗在24小时内通过小狗试药的方式找出哪瓶药有毒或者全部无毒(小狗服完药20小时后才能判断是否中毒)。下面请看网友的解法:把狗从0-9编号;把药水按1-1000编号;把药水编号按二进制,如果第i位(因为最大1000,所以bit位为0-9)bit位为1,则分给编号为i的狗狗喝;最后得一二进制数,如果编号为i的狗狗死

yusongwhu的专栏 1216

【电子通识】TINA-TI怎么使用受控源向导创建受控源

TINA-TI怎么使用受控源向导创建受控源

一点硬件 357

qq公司的08年招聘面试题:10只狗找毒药

问题描述1000瓶药水,其中至多有1瓶剧毒,现在给你10只小狗在24小时内通过小狗试药的方式找出哪瓶药有毒或者全部无毒(小狗服完药20小时后才能判断是否中毒) 分析:“1000瓶药水,其中至多有1瓶剧毒”可以分成1001种情况:无毒,我们用0表示;第N(110只小狗,每只狗有两种情况:中素和没中毒。10只狗总共可以表示1023种状态,我们用0到1023表示。显然此问题可以抽象成10进制与二进制

闻缺陷则喜何志丹 2217

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

1000瓶药水,其中至多有1瓶剧毒

1000瓶药水,其中至多有1瓶剧毒现在给你10只小狗在24小时内通过小狗试药的方式找出哪瓶药有毒或者全部无毒(小狗服完药20小时后才能判断是否中毒) 10只小狗每只都有死和不死两种情况,所以死亡情况就有2的10次方=1024种1024大于1000,也就是说判断出毒药是可以实现的用2进制表示1000瓶药,用2进制的位表示小狗,就能建立起这个问题的数学模型1000瓶毒药编号为...

weixin_30487701的博客 382

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【Killua笔试面试题整理】小狗试药

【题目描述】1000瓶药水,其中至多有1瓶剧毒,现在给你10只小狗在24小时内通过小狗试药的方式找出哪瓶药有毒或者全部无毒(小狗服完药20小时后才能判断是否中毒)   【题目来源】08腾讯   【题目分析】 方法一:   将药水进行二进制编号,比如第一瓶是0000000001,第十瓶是0000001010......   将小狗1~10的编号,一号小狗对应二进制数的第一位,二号小狗对

异リ度ュ空ウ間(镜像站) 1211

一个腾讯的面试题 小狗试毒

一个腾讯的面试题 1、1000瓶药水,其中至多有1瓶剧毒,现在给你10只小狗在24小时内通过小狗试药的方式找出哪瓶药有毒或者全部无毒(小狗服完药20小时后才能判断是否中毒)。 解题思路:首先,不能考虑(24-20=4小时),在4小时内,将1000瓶药水依次喂给10只狗,将喂药的时间点与药水记录下来。不考察这种查找方式。 标准的解题方法: 把狗从0-9编号; 把药水按1-1000编号;...

zhusongziye的博客 710

腾讯的面试题(很有科技含量)

原文地址:http://gc063tzf.blog.163.com/blog/static/112162922008101611184793/   昨天同学发过来一道思考题(下面的第1题),令我受益良多。 1、1000瓶药水,其中至多有1瓶剧毒,现在给你10只小狗在24小时内通过小狗试药的方式找出哪瓶药有毒或者全部无毒(小狗服完药20小时后才能判断是否中毒)。 下面的2-8题仅作存档用,没

碧水蓝天 4150

【黑马程序员西安中心】一个腾讯的面试题

1、1000瓶药水,其中至多有1瓶剧毒,现在给你10只小狗在24小时内通过小狗试药的方式找出哪瓶药有毒或者全部无毒(小狗服完药20小时后才能判断是否中毒)。—腾讯面试题解题思路:首先,不能考虑(24-20=4小时),在4小时内,将1000瓶药水依次喂给10只狗,将喂药的时间点与药水记录下来。不考察这种查找方式。标准的解题方法:把狗从0-9编号;把药水按1-1000编号;把药水编号按二进制,如果第i...

qq_39581763的博客 520

一个腾讯的面试题

原文:腾讯的面试题(很有科技含量) 1、1000瓶药水,其中至多有1瓶剧毒,现在给你10只小狗在24小时内通过小狗试药的方式找出哪瓶药有毒或者全部无毒(小狗服完药20小时后才能判断是否中毒)。—腾讯面试题 解题思路:首先,不能考虑(24-20=4小时),在4小时内,将1000瓶药水依次喂给10只狗,将喂药的时间点与药水记录下来。不考察这种查找方式。 标准的解题方法: 把狗从0-9编号;...

凌大大的博客 3051

一道有趣的腾讯的面试题

今天在blog里见到一道有趣的面试题,记录下来,分享一下。原文地址:http://gc063tzf.blog.163.com/blog/static/112162922008101611184793/题目:1000瓶药水,其中至多有1瓶剧毒,现在给你10只小狗在24小时内通过小狗试药的方式找出哪瓶药有毒或者全部无毒(小狗服完药20小时后才能判断是否中毒)。—腾讯面试题标准的解题方法:把狗从0-9编...

m0_37732829的博客 342

面试题十五期-一个腾讯的面试题~biu

  一个腾讯的面试题   1、1000瓶药水,其中至多有1瓶剧毒,现在给你10只小狗在24小时内通过小狗试药的方式找出哪瓶药有毒或者全部无毒(小狗服完药20小时后才能判断是否中毒)。   解题思路:首先,不能考虑(24-20=4小时),在4小时内,将1000瓶药水依次喂给10只狗,将喂药的时间点与药水记录下来。不考察这种查找方式。 标准的解题方法: 把狗从0-9编号;   把...

312

算法搜集

1.1000瓶药水,其中至多有1瓶剧毒,现在给你10只小狗在24小时内通过小狗试药的方式找出哪瓶药有毒或者全部无毒(小狗服完药X小时后才会毒发。19 答案: 把狗从0-9编号; 把药水按1-1000编号; 把药水编号按二进制,如果第i位(因为最大1000,所以bit位为0-9)bit位为1,则分给编号为i的狗狗喝; 最后得一二进制数,如果编号为i的狗狗死了,该数的第i bit位为1,

Just do it! 1148

qq公司的08年招聘面试题:10只狗找毒药收藏

从社区置顶转来的:  qq公司的08年招聘面试题:10只狗找毒药收藏问题描述1000瓶药水,其中至多有1瓶剧毒,现在给你10只小狗在24小时内通过小狗试药的方式找出哪瓶药有毒或者全部无毒(小狗服完药20小时后才能判断是否中毒) 分析:“1000瓶药水,其中至多有1瓶剧毒”可以分成1001种情况:无毒,我们用0表示;第N(110只小狗,每只狗有两种情况:中素和没中毒。10只狗总共可以表示

云海西边的码头 1561
上一篇: 实现最简单的正则表达式
下一篇: 位运算——判断整数a是否为2的正整数幂?
CodeArhat
博客等级 码龄15年 13粉丝 38原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值