1936 哪一瓶是毒药?

2024-01-13 03:18
文章标签 毒药 一瓶 1936

本文主要是介绍1936 哪一瓶是毒药?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

哪一瓶是毒药?

Time Limit:1000MS  Memory Limit:65536K
Total Submit:360 Accepted:91

Description

记得宣讲会的时候,管大神讲过一道小白鼠测毒药的问题,现在我们来泛化一下这个问题。假设有N个瓶,由于瓶子上标签丢失,我们不知道瓶子到底是普通水还是毒药,但是唯一能确定的是,其中有且只有一瓶是毒药,其他都是普通水。由于毒药是慢性毒药,小白鼠喝下去可能要过几天才会死亡,为了节约时间,我们想一次性测出哪一瓶是毒药。但是由于实验室的小白鼠不是无限的,所以希望用尽量少的小白鼠来检测出毒药。亲爱的ACMer们,你有什么好的方案吗?

Input

有多组测试数据,每组测试数据输入一个整数N(0 < N < 10^8)

Output

输出最少使用的小白鼠数量。 

Sample Input

1
2

Sample Output

0

1

一道非常非常好的题目啊啊啊啊啊啊!!!!!好到我直接五体投地;;

思想;是这样的,我们把n个瓶子(n个状态)标号为0~~n-1,假设1到n-1全部化成二进制最多k位,,那么我们把1~n中所有第k位为1的瓶子给第一个小白鼠喝,如果小白鼠死了,那么毫无疑问,有毒瓶子的第k位为1,如果没死,那么有毒瓶子第k位为0,接下来,第k-1位所有数字为1的瓶子给第2个小白鼠喝,如果小白鼠死了,那么该有毒瓶子的第k-1位为1,否则为0,后面以此类推,,不难得出总共需要的小白鼠的个数就是n-1的二进制位数

这个神算法 据说叫警官算法,一个侦探发现的,无比佩服

#include<stdio.h>

#include<string.h> int main() {int n;while(~scanf("%d",&n)){int p=0;n--;while(n>=1){p++;n>>=1;//因为是右移,所以n--1的最高位必定是1,而不会是0;}printf("%d\n",p);}return 0; }

这篇关于1936 哪一瓶是毒药?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/600070

相关文章

找出有毒的那一瓶药

找出有毒的那一瓶药 找出有毒的那一瓶药问题描述求解方法二进制编码方法详细示例 找出有毒的那一瓶药 问题描述 有47瓶药,其中只有一瓶有毒。从中毒到死亡时间为4天,问最少准备几只老鼠,在4天时间内找出有毒的药? 求解方法 要在4天内确定有毒药瓶,最少需要 6 只老鼠。以下是如何使用这 6 只老鼠来找出有毒药瓶的方法。 二进制编码方法 药瓶编号: 将47瓶药瓶编号从1到

新周刊:现代社会三粒毒药

三大毒药:消费主义、性自由和成功学 来自《新周刊》 现代社会有三粒毒药:消费主义、性自由和成功学。 消费主义以品牌为噱头,以时尚为药效,将人卷入无休止的购买与淘汰的恶性循环中, 恋物成瘾; 性自由以人性为噱头,以性爱为药效,不断释放暧昧与激丨情的烟幕弹,纵欲成瘾; 成功学以速成为噱头,以名利为药效,误导急于走捷径成为人上人的年轻人投身其中, 投机成瘾。

有1000个一模一样的瓶子,其中有999瓶是普通的水,有一瓶是毒药。任何喝下毒药的生物都会在一星期之后死亡。现在,你只有10只小白鼠和一星期的时间,如何检验出那个瓶子里有毒药?

浅谈一下1000瓶水有关思路(图解)与用java代码具体解决方案 1,原题      面试题:有1000个一模一样的瓶子,其中有999瓶是普通的水,有1瓶是毒药。任何喝下毒药的生物都会在一星期之后死亡。现在,你只有10只小白鼠和一星期的时间,如何检验出那个瓶子里有毒药?(1000瓶水,1瓶毒药,1星期死亡,10只老鼠)   2,四种思路     今天老师说了如上这道题。自己感觉比较有趣。

POJ 1936 All in All 字符串 水题

题意:没什么好说的,不过因为没看清题,输出大写的YES,NO,贡献了两次,泪流满面。函数strlen不要写在循环内就OK了。否则会耗去大半时间。 题解: #include <iostream>using namespace std;#define N 100010char str1[N], str2[N];int main(){while ( scanf("%s%s",str1,str2)

All in All POJ - 1936 (串)

这道题非常水,题意是判断前面的串是否是后面串的子串(前面串的每个字符在后面串都出现,并且出现顺序是前面串每个字符的出现顺序即可) #include <stdio.h>#include <string.h>#include <algorithm>#include<iostream>using namespace std;char s1[100010],s2[1000

一瓶5.86万,听花酒什么来头?

听花酒,到底什么来头? 宣称有提升免疫力、改善睡眠、保障男性功能、调节生理紊乱、抗衰老等功效的听花酒,被3·15晚会曝光了。 相关话题词随即冲上了热搜。之后,售价最高达58600元的听花酒被京东、拼多多、淘宝等电商平台火速下架,公司微信公号也被封禁,上交所更是连夜向听花酒所属上市公司——青海春天发去监管工作函,要求其说明,产品宣传是否如媒体报道违反了广告法等。 但与宝马、世纪佳缘、同程金

资本入侵智能家居 蜜糖还是毒药?

自2016年年初以来,智能家居市场快速升温,并引来大量金融资本和产业资本的蜂拥而至,日前,再有重量级“大象”宣布携手进入该领域。 资本入局,智能家居市场再起波澜? 6月28日在北京,知名VC信中利投资公司与海尔家居宣布,联合成立12亿元的产业基金,主要投资于智能家居、高端消费与升级领域。 “让我们一起共同见证资本、创意和产业龙头的完美结合,希望我们的合作能够给大家带来更多美好的产品”,信中利资本

乐羊羊饮料厂正在举办一次促销优惠活动。乐羊羊C型饮料,凭3个瓶盖可以再换一瓶C型饮料,并且可以一直循环下去,但不允许赊账。

【问题描述】 乐羊羊饮料厂正在举办一次促销优惠活动。乐羊羊C型饮料,凭3个瓶盖可以再换一瓶C型饮料,并且可以一直循环下去,但不允许赊账。 请你计算一下,如果小明不浪费瓶盖,尽量地参加活动,那么,对于他初始买入的n瓶饮料,最后他一共能得到多少瓶饮料。 输入:一个整数n,表示开始购买的饮料数量(0<n<10000) 输出:一个整数,表示实际得到的饮料数 样例输入: 100 样例输出: 149

java2个啤酒瓶换一瓶啤酒,一道笔试题:每瓶啤酒2元,3个空酒瓶或者5个瓶盖可换1瓶啤酒。100元最多可喝多少瓶啤酒?...

题目:每瓶啤酒2元,3个空酒瓶或者5个瓶盖可换1瓶啤酒。100元最多可喝多少瓶啤酒?(不允许借啤酒) 思路:利用递归算法,一次性买完,然后递归算出瓶盖和空瓶能换的啤酒数 程序如下:#include int GetNumber(int cap,int empty,int bottle)//cap瓶盖,empty空瓶,bottle啤酒瓶 { if(empty < 3 && cap < 5) { r

瞎玩 - 一瓶啤酒2块,两个瓶盖送一瓶,四个空瓶换一瓶。20元一共可以喝几瓶

问题: 一瓶啤酒2块,两个瓶盖送一瓶,四个空瓶换一瓶。20元一共可以喝几瓶? 思路: 啤酒,对我们有用的属性就是瓶盖和空瓶,10瓶啤酒可以考虑分别计算瓶盖和空瓶所得瓶数,再求和即可! 代码如下: #include <stdio.h>#include <stdlib.h>#define MONEY 20unsigned int compute_fun(unsigned int m,u