| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4008 人关注过本帖, 1 人收藏
标题:有一1000桶酒,其中一桶是毒酒,现在通过10个小老鼠来查处哪桶酒是毒酒?用 ...
只看楼主 加入收藏
潜龙出水
Rank: 2
等 级:论坛游民
帖 子:3
专家分:30
注 册:2014-9-4
收藏
得分:0 
我担心那些老鼠,还没喝到毒酒,就因为喝多了,肝爆裂,死了。
2015-01-13 14:29
轉身已陌路
Rank: 2
等 级:论坛游民
帖 子:25
专家分:16
注 册:2014-12-25
收藏
得分:10 
二分查找,1000很快查出,楼主可以试试,绝对用不到10个老鼠。2~10是1024,明白?
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

void ttSearch(){

    //申明time类型的数据
    time_t tms;//定义一个time类型的数据
    srand((unsigned int)time(&tms));//生成随机数种子

    int arr[100];
    int i;
    for (i = 0; i < 100; i++){
        arr[i] = rand() % 100;
        printf("arr[%d] = %d\n", i, arr[i]);
    }
   

    //二分查找
    int first = 0;
    int last = 100;
    int mild = 0;
    int n = 23;
    int count = 0;
   
    while (first < last){
        mild = (first + last) / 2;
        printf("first = %d,mild  = %d,last = %d\n", first, mild, last);
        if (arr[mild] == n){
            printf("找到啦!");
            break;
        }
        else if (arr[mild] > n){
            last = mild - 1;
        }
        else{
            first = mild + 1;
        }
        count++;
    }
   
   
    printf("一共查找了:%d次.\n", count);

}


void main(){

    ttSearch();

    system("pause");

}
c
2015-01-13 15:19
轉身已陌路
Rank: 2
等 级:论坛游民
帖 子:25
专家分:16
注 册:2014-12-25
收藏
得分:0 
二分查找
2015-01-13 15:27
茅十八
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:35
专家分:123
注 册:2014-3-11
收藏
得分:10 
你老师的这道题 ,出得好。
应该很多人都不能想明白提示的解题步骤和思路,想想看,十只老鼠刚好对应10位,所以肯定都要用上!!
建议看懂解题思路和步骤,再动手!
我个人的算法,不是最好的,你自己也要推敲一下。
 
程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main()
{
    int iRnd,mouse,wine,IsDead ,result = 0;
    srand((unsigned)time(NULL));    //置随机种子
    iRnd = 1 + rand() % 1000;        //从1到1000中,产生一个随机数,代表毒酒的标号
    for(mouse = 0 ;mouse < 10; ++mouse)   
    {   
        IsDead = 0;    //    每只老鼠在尝酒之前都是活的
        //测试代表毒酒标号数值的10位的二进制数,每一位是0还是1
        for(wine = 1; wine <= 1000; ++wine)
        {
            if( !(wine & (1 << mouse) ))    //测试第N位为1的数,有没毒酒存在
                continue;
            else
            {
                if(wine == iRnd)    // 意味着喝过毒酒
                {
                    IsDead = 1;        // 代表死亡
                    break;
                }
            }
        }
        if(IsDead)    //如果老鼠死了,证明这一位,数值一定为1
            result += (1 << mouse);
    }
    printf("随机产生的毒酒标号:%d\n经检验出的毒酒标号:%d\n",iRnd,result);
    return 0;
}


[ 本帖最后由 茅十八 于 2015-1-13 17:16 编辑 ]

个人QQ:1789851851,有学习问题,欢迎找我讨论,另外Win32 SDK开发群:179492890
2015-01-13 17:04
执笔画江山
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:265
专家分:1010
注 册:2015-1-13
收藏
得分:0 
思路逆天  发人省醒  值得一试

授人以鱼,不如授人以渔
2015-01-13 17:18
茅十八
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:35
专家分:123
注 册:2014-3-11
收藏
得分:0 
以下是引用Whale壹零四在2015-1-12 23:04:33的发言:

思路:  
 
为何需要老鼠做实验,显然是根据老鼠的死活来判断酒的毒性,每一只老鼠只有2种状态,死和活,n只老鼠就是这n个死或活的状态,应该由此敏感的联想到二进制,隐约去感知1000这个数量与n的关系,2^n能表示多少的信息量呢?2^10=1024,想到这里我们可以试着去用10个老鼠去做一下实验。  
 
步骤:  
 
把1000桶酒分别以10位二进制数标号,从0000000001至1111101000,从这1000个二进制数中寻找毒酒,毒酒也一定是0和1的某种组合,所以问题转化为如何得出这个组合的每一位都是多少,我们先思考如何得出第一位(从右到左)是0还是1,结论是只要把所有第一位是1的酒给一只老鼠喝,如果这只老鼠最终死了,可知毒酒的第一位一定是1,如果这只老鼠还活着,可知毒酒第一位一定是0.依次类推,我们使用10只老鼠便可判断毒酒的每一位是多少。从而得到毒酒的二进制数,转化成10进制便只是第几桶。
思路和步骤 ,非常好,看完以后,受益匪浅。

个人QQ:1789851851,有学习问题,欢迎找我讨论,另外Win32 SDK开发群:179492890
2015-01-13 17:27
Whale壹零四
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2015-1-6
收藏
得分:0 
回复 24楼 茅十八
谢谢 我好好想想

Hello world!
2015-01-13 21:23
bxl131
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2015-1-15
收藏
得分:0 
老鼠喝多了喝不下去了怎么办?
2015-01-15 10:33
快速回复:有一1000桶酒,其中一桶是毒酒,现在通过10个小老鼠来查处哪桶酒是毒酒 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014179 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved