| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4228 人关注过本帖
标题:只有天才才能做得出来的题
只看楼主 加入收藏
reebokjyn
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2008-6-19
收藏
得分:0 
有点思路了,要从前面几楼的3分法入手...
不过接下情况太多了还真是麻烦,只能一步一步慢慢走了
2008-06-20 22:59
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
我不是给出了确定性的设计思路了吗?
孔明的办法,在于由代码本身设计策略,所以我才觉得好玩。
我的办法是由人设计策略,然后使用代码实现。
明白差别了么?

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-06-20 23:14
爱喝牛奶的猫咪
Rank: 1
来 自:QQ群46520219
等 级:禁止访问
帖 子:513
专家分:0
注 册:2008-6-16
收藏
得分:0 
自动推理的会好玩得多


" border="0" />[color=white]
2008-06-20 23:24
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
我没看过答案。。
我会把12个球分3份:
第一次:随机取两份,如果是两份一样重,那么异常的是第三份,如果不一样重,那么剩下的一定是正常的。
第二次:通过第二次判断异常的球是重了还是轻了,由第一次情况一定可以判定的;
第三次:取出异常的那四个,一分为2,因为已经判断球是轻是重了,从两边天平重取一个球交换。。如果平衡没有改变,那么就是留下的那个,如果改变了,就是拿走的那个。。
是不是超过要求了?

学习需要安静。。海盗要重新来过。。
2008-06-20 23:32
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
第二次:通过第二次判断异常的球是重了还是轻了,由第一次情况一定可以判定的;

由第一次,是不能判定的……

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-06-20 23:37
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
我是说,第一次已经可以知道哪组是正常,那组是异常的了,(对于平衡的情况我们知道剩下的是异常,盘子里是正常,第2次比较下就可以了;对于不平衡的那组我们知道剩下的是正常,第2次只要和正常的比较就知道哪个是异常还知道轻了还是重了)只要对比下异常和正常就可以判断异常是轻了还是重了。。不过我好像还是错了。。因为我比较了4次

[[it] 本帖最后由 sunkaidong 于 2008-6-20 23:46 编辑 [/it]]

学习需要安静。。海盗要重新来过。。
2008-06-20 23:41
himpo
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:192
专家分:123
注 册:2008-5-16
收藏
得分:0 
MS燕子的论坛上有13个球的。

第一次4 V 4  
以后的情况得看前一次称量的结果。。

总之要一大堆的if   else 语句。。。


以下从http://转载:(关于13个球的称法)



题目描述:
有13个外表一模一样的球,编号从1-13,
不过有一个球的质量和其它的球不一样,
并且不知道是轻了还是重了。
现在需要你使用一个天平称三次以内找出来。
程序接口:
猜测函数声明:
int IBalanceBalls(
    int nBalls,    // 你要称多少个球
    int nLBall[],  // 天平左盘要称的球的编号所组成的数组
    int nRBall[]   // 天平右盘要称的球的编号所组成的数组
);
返回值:
1 :右盘重
0 :两边平衡
-1:左盘重

提交函数声明:
int ISubmit(
    int nBallIndex // 质量不一样的球的编号
);
返回值:
0: 无下一测试数据,请退出程序
1: 还有下一组数据,请接着循环

输入:
无输入

输出:
无输出。

样例输入:
无样例

样例输出:
无样例

其它信息:
nLBall和nRBall那两个数据的下标从0至nBalls-1为有效内容
里面的内容是球的编号,注意是从1-13,否则会RE
以上两个函数已预定义,不需要声明便可使用
IBalanceBalls函数调用三次以后必须调用ISubmit函数,否则会出错

难度:Normal


#define PB_ID 88
int noEnd =1;
int Search8(int n, int heavy[], int light[], int rest[])
{
    int a[3] = {heavy[0], heavy[1], rest[0]};
    int b[3] = {heavy[2], heavy[3], light[0]};
    int temp =IBalanceBalls(3, a, b);
    if( 0 ==temp)
    {
        if( 0 ==(temp =IBalanceBalls(1, light+1, light+2)))
            noEnd = ISubmit(light[3]);
        else if( -1 ==temp )
            noEnd = ISubmit(light[2]);
        else
            noEnd = ISubmit(light[1]);
    }
    else if(-1 == temp)
    {
        if( 0 == (temp =IBalanceBalls(1, heavy, heavy+1)))
            noEnd = ISubmit(light[0]);
        else if( -1 == temp)
            noEnd = ISubmit(heavy[0]);
        else
            noEnd =ISubmit(heavy[1]);
    }
    else
    {
        if( -1 ==IBalanceBalls(1, heavy+2, heavy+3))
            noEnd = ISubmit(heavy[2]);
        else
            noEnd = ISubmit(heavy[3]);        
    }
    return 0;
}

int main()
{
    while( noEnd)
    {
        int lBalls[4] = {1,2,3,4};
        int rBalls[4] = {5,6,7,8};
        int rest[5] = {9,10,11,12,13};
        int n;
        if(0 ==(n=IBalanceBalls(4, lBalls, rBalls)))
        {
            if(0 ==(n=IBalanceBalls(3, lBalls, rest)))
            {
                if( 0 ==(n= IBalanceBalls(1,lBalls, rest+3)))
                    noEnd =ISubmit(rest[4]);
                else
                    noEnd =ISubmit(rest[3]);
            }
            else if( -1 == n)
            {
                if( 0 ==(n = IBalanceBalls(1,rest,rest+1)))
                    noEnd =ISubmit(rest[2]);
                else if(-1 == n)
                    noEnd = ISubmit(rest[1]);
                else
                    noEnd = ISubmit(rest[0]);
            }
            else
            {
                if( 0 ==(n = IBalanceBalls(1,rest,rest+1)))
                    noEnd = ISubmit(rest[2]);
                else if(-1 == n)
                    noEnd =ISubmit(rest[0]);
                else
                    noEnd = ISubmit(rest[1]);
            }
        }
        else if(-1 ==n)
            Search8(4,lBalls, rBalls, rest);
        else
            Search8(4,rBalls,lBalls, rest);
    }
    return 0;
}


1、其中关于IBalanceBalls函数我想是关于两边球的质量和的比较,这个比较简单。。。可以自己写。
   但是我对于函数调用次数怎么统计不清楚,请高手给我个实例。。谢谢!
2、ISubmit就更简单了,一个判断加return,也可以加上一个输出。

我是新手,如有不对,请指正。。

望有高手帮我解决函数调用次数的统计问题。。

[[it] 本帖最后由 himpo 于 2008-6-21 08:35 编辑 [/it]]
2008-06-21 08:27
stephen250
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2008-6-9
收藏
得分:0 
这道题目我记得有一年有个论文用了叫做“三进代码”的算法,好像比传统算法快不少。
2008-06-21 09:02
cqxlove
Rank: 1
来 自:广东
等 级:新手上路
帖 子:35
专家分:0
注 册:2008-6-5
收藏
得分:0 
[bo][un]reebokjyn[/un] 在 2008-6-20 22:39 的发言:[/bo]

我也来灌水   
一个二分法就好了,第一次6:6,排除6个,第二次3:3,排除3个,最后一次从3个中取出2个,1:1,如果取出的两个一样重就是第三个。大概就是这样吧。20秒就想好了,果然是标题党,我这样的人都能马上想出 ...


如果取出来的不一样重呢???你的想法不够严谨,二分法绝对不行!!!

热爱编程,多多指教
2008-06-21 20:21
simpley
Rank: 1
等 级:新手上路
帖 子:262
专家分:0
注 册:2005-2-23
收藏
得分:0 
半个小时做出来的人确实是天才,前提是真正靠自己的智慧。

靠见多识广做出来也值得肯定,但不能骄傲,毕竟具有创造力的人是极少的

myQQ::445750010
2008-06-21 22:39
快速回复:只有天才才能做得出来的题
数据加载中...
 
   



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

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