首页
社区
课程
招聘
[讨论]一道小学奥赛题
发表于: 2005-8-8 19:07 16898

[讨论]一道小学奥赛题

2005-8-8 19:07
16898
收藏
免费 0
支持
分享
最新回复 (55)
雪    币: 442
活跃值: (1216)
能力值: ( LV12,RANK:1130 )
在线值:
发帖
回帖
粉丝
26
24楼很难控制的说
2005-8-11 20:22
0
雪    币: 254
活跃值: (126)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
27
控制面板里把键盘重复率设置的低一些,很好控制
我用windows的计算器试验效果不错
2005-8-11 20:29
0
雪    币: 216
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
28
最初由 heXer 发布
如果考虑计算机键盘的粘滞性(目前计算机的键盘确实也是这样的特性)
那么只需按一次红键,直到结果为17179869184放开键盘,然后再按一次黄键,直到结果为17再放开


找了半天也没看见黄键和红键阿,我的罗技键盘,你的什么?
2005-8-12 16:48
0
雪    币: 201
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
29
汗,琢磨了半天,原来俺的水平还没赶上小学毕业...

哪位写个算法出来看看哈
2005-8-15 16:07
0
雪    币: 201
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
30
哪位大侠贴个用计算机语言的算法呀
2005-8-16 09:21
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
31
最初由 酷酷 发布
哪位大侠贴个用计算机语言的算法呀


本来也考虑到可能用树的生成和搜索,但后来发现我们不是动态生成树,而几乎是一个搜索的过程。考虑f(x)=2x g(x)=[x/10],题目的意思就是对8通过某种f,g的迭代运算得到17,并且要求g运算尽量少。这样考虑:
8是树根,f运算得到左儿子,g运算得到右女儿,呵呵!那么,这个二叉树中的某个叶子肯定是8的儿子的女儿的……女儿的儿子的……,把这个过程想象成儿子1,女儿0,顺序写下来就是一个操作码。
算法:男左女右,只要17出现在某个深度上,我们对每层扫描,扫到的左边第一个就是满足要求的。
程序:
#include<stdio.h>

//we use f(x)=2x , g(x)=[x/10]

void main(void)
{
        unsigned long op;        //indicator ff...g...
        unsigned long t;
        unsigned long deep,i,k,l;
       
        for(deep=1;deep<29;deep++){
/*                if(deep&1){
                        k=((2<<deep)-1)/3;                //k=(2^(deep+1)-1)/3
                }else{
                        k=((2<<deep)-2)/3;        //k=2/3*(2^deep-1)=(2^(deep+1)-2)/3
                }
*/
                k=(int)(((2<<deep)-1)/3);
                for(i=(2<<(deep-1))-1;i>=k;i--){
                        for(op=i;op<0x80000000;op<<=1)        //shift logical ruler
                                ;
                        for(t=8,l=0;l<deep;op<<=1,l++){        //caculate ff...g...(x)
                                if(op&0x80000000){
                                        t<<=1;
                                }else{
                                        t/=10;
                                }
                        }
                        if(t == 17){
                                printf("We get it ! op=0x%x\n",i);
                                goto endit;
                        }
                }
        }
endit:
        return;
}

输出:0x7bf3fc 即 11110111111001111111100,含义
4红1黄6红2黄8红2黄,还是需要5次黄键的。
2005-8-19 14:35
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
32
应该知道4次黄键是不可能的,而5次是可能的!
因为从f(x)=2x g(x)=[x/10]可以知道,按4次f,有可能用一次g把结果变成1,
而5次f,2^5=32,一次g得到3,结果不是1。
如果按4次黄键得到了17,你最多可能按的红键数为4*4=16,总按键数20,已经在我们的搜索深度内了。
如果是5次,5+5*4=25,可能的范围深度是25,我们没达到。
当然,可行的结果已经有了。
2005-8-19 14:58
0
雪    币: 398
活跃值: (343)
能力值: (RANK:650 )
在线值:
发帖
回帖
粉丝
33
最初由 JGsHEn 发布


本来也考虑到可能用树的生成和搜索,但后来发现我们不是动态生成树,而几乎是一个搜索的过程。考虑f(x)=2x g(x)=[x/10],题目的意思就是对8通过某种f,g的迭代运算得到17,并且要求g运算尽量少。这样考虑:
8是树根,f运算得到左儿子,g运算得到右女儿,呵呵!那么,这个二叉树中的某个叶子肯定是8的儿子的女儿的……女儿的儿子的……,把这个过程想象成儿子1,女儿0,顺序写下来就是一个操作码。
算法:男左女右,只要17出现在某个深度上,我们对每层扫描,扫到的左边第一个就是满足要求的。
........


学习啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
2005-8-19 15:20
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
34
最初由 CoDe_Inject 发布
17 != 8*2所以至少一次R
17X X的取值是0 2 4 6 8,穷举这一轮8*2^n无结果,继续下一轮
170/2 85 85X
172/2 86 86X
。。。
........

理解了这种思想,问题迎刃而解!
2005-8-20 15:53
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
35
最初由 heXer 发布
如果考虑计算机键盘的粘滞性(目前计算机的键盘确实也是这样的特性)
那么只需按一次红键,直到结果为17179869184放开键盘,然后再按一次黄键,直到结果为17再放开


哎~~~~大哥你好BT!这样玩keyboard~
PS:不好控制啊
可以考虑用按键精灵了
2005-8-20 16:00
0
雪    币: 117
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
36
晕了,.这倒题..是得到数17还是只要得到的数的最后两位是17??
2005-8-21 00:11
0
雪    币: 254
活跃值: (126)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
37
建议楼上先学语文,再学数学
2005-8-22 10:15
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
38

还没算出
2005-8-22 20:47
0
雪    币: 239
活跃值: (478)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
39
哈哈,这道题有的搞了
2005-8-23 08:55
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
40
红键 = *2
黄键如果光用数学的+-*/好像没办法表示,换言之如果不靠手工或机器帮忙进行取整操作,那么怎么办呢?
2005-8-23 11:54
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
41
JGsHEn 很专业

应该是正解
2005-8-23 15:15
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
42
5次黄键
现分析如下:
1 2 4 8 16 32 64 128  (1 2 4 8)   
3 6 12 24 48 96(3 6)
5 10 20 40 80 160(5 10)
7 14 28 56 112 (7)
9 18 36 72 144 (9)
这次的分类就是从我的一次计算(51+51=112)呵呵,大家可不要笑我.看见38楼的
,为什么我改的原因就在这里,真的很丢人呀.....刚开始我的答案是3次.原因也在这儿,8 16 32 64 128 512 第一次
51 112(再次骂我自已,真不知道我是怎么得到小学毕业证的)  第二次
11 22 44 88 176呵呵.再按一次黄键就行了.
后来,我就注意到"11"只要我能变到11?(?代表某个数字),问题就解决了.注意 (3 6)(7)(9)
8 16 32  第一次
3 6 12 24 48 96  第二次
9 18 36 72  第三次
7 14 28 56 112 第四次
11 22 44 88 176 第五次
完了,因为每一步都是必要的,所以是最少须按5次黄键
呵呵,我是初学者,现在连这个版的"win32/win64编程"都不明白,还请各位指教.我应先学学什么?????
2005-8-24 21:56
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
43
大家好像都理解错了,是要得到17,17前面不能有数字的……
这应该是一道关于树的题目,可以考虑用动态规划的方法来做……
2005-9-3 10:10
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
44
JGsHEn的算法好像还可以优化的说。
可以考虑使用剪枝二叉树的。(没看程序,不知道用了没)
但是,个人认为,最好使用动态规划比较好一点……不然时间复杂度太恐怖了……(要考虑题目的任意性,初始数据和目标数据都有可能是任意的,而且最好要考虑一下高精度的计算,万一是一个n多位的数据就不好了哈……竞赛的坏习惯哈哈哈)
2005-9-3 10:16
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
45
I like,thx everyone...
2005-9-7 11:45
0
雪    币: 117
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
46
最初由 heXer 发布
建议楼上先学语文,再学数学


学习小学语文中
2005-9-11 12:17
0
雪    币: 305
活跃值: (36)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
47
JGsHEn 的方法正解。
2005-9-12 12:33
0
雪    币: 214
活跃值: (70)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
48
优点意思~~~
2005-10-13 16:09
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
49
其实很简单,把题目用计算机的二进制表示来理解就成了
按红键=*2:也就是左移一位
黄键去掉左边的数:也就是右移一位
17 = 10001
8 = 1000
按一次黄键,右移一次就完成了
所以答案是黄键比红键多按一次
2005-10-22 08:54
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
50
需要想一下~!
2005-10-22 15:58
0
游客
登录 | 注册 方可回帖
返回
//