免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: linuxchyu
打印 上一主题 下一主题

[算法] 一道上海交大研究生入学考试试题:物以稀为贵 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2013-03-14 10:50 |只看该作者
本帖最后由 hisptoot 于 2013-03-14 10:51 编辑
  1. #!/usr/bin/env perl
  2. my $num = 8;
  3. my %map = (
  4.                 1 => [2,4],
  5.                 2 => [1,3,5],
  6.                 3 => [2,6],
  7.                 4 => [1,5,7],
  8.                 5 => [2,4,6,8],
  9.                 6 => [3,5,9],
  10.                 7 => [4,8],
  11.                 8 => [5,7,0,9],
  12.                 9 => [6,8],
  13.                 0 => [8]
  14.           );

  15. my %cal = ( );

  16. foreach my $key (keys %map) {
  17.         $cal{"$key"."2"} = $#{$map{$key}} + 1;
  18. }

  19. for(my $i = 3; $i<=$num; $i++)
  20. {
  21.         foreach my $key (keys %map) {
  22.                 my $count = 0;
  23.                 my $j = $i - 1;
  24.                 foreach my $pos (@{$map{$key}}) {
  25.                         $count += $cal{"$pos$j"};
  26.                 }
  27.                 $cal{"$key$i"} = $count;
  28.         }
  29. }

  30. my $count = 0;
  31. foreach(0..9)
  32. {
  33.         $count += $cal{"$_$num"};       
  34. }

  35. print $count;
复制代码
  14826

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
12 [报告]
发表于 2013-03-14 10:52 |只看该作者
回复 11# hisptoot


    嗯,合并那里写错了

论坛徽章:
154
2022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:5720周年集字徽章-年
日期:2022-10-26 16:44:2015-16赛季CBA联赛之深圳
日期:2022-11-02 14:02:4515-16赛季CBA联赛之八一
日期:2022-11-28 12:07:4820周年集字徽章-20	
日期:2023-07-19 08:49:4515-16赛季CBA联赛之八一
日期:2023-11-04 19:23:5115-16赛季CBA联赛之广夏
日期:2023-12-13 18:09:34
13 [报告]
发表于 2013-03-14 12:52 |只看该作者
回复 10# bruceteen


    给你前三位都是888  后面8位是上面的数字  每个数的相邻只有有限个数字

题目有点理解不对,三个8后面(第四位)可以是任何数字,不受“将步”限制;所以还请高手再来一下{:3_200:}

论坛徽章:
154
2022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:5720周年集字徽章-年
日期:2022-10-26 16:44:2015-16赛季CBA联赛之深圳
日期:2022-11-02 14:02:4515-16赛季CBA联赛之八一
日期:2022-11-28 12:07:4820周年集字徽章-20	
日期:2023-07-19 08:49:4515-16赛季CBA联赛之八一
日期:2023-11-04 19:23:5115-16赛季CBA联赛之广夏
日期:2023-12-13 18:09:34
14 [报告]
发表于 2013-03-14 12:57 |只看该作者
本帖最后由 shang2010 于 2013-03-15 17:29 编辑

回复 9# cjaizss


  issue close......

论坛徽章:
154
2022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:5720周年集字徽章-年
日期:2022-10-26 16:44:2015-16赛季CBA联赛之深圳
日期:2022-11-02 14:02:4515-16赛季CBA联赛之八一
日期:2022-11-28 12:07:4820周年集字徽章-20	
日期:2023-07-19 08:49:4515-16赛季CBA联赛之八一
日期:2023-11-04 19:23:5115-16赛季CBA联赛之广夏
日期:2023-12-13 18:09:34
15 [报告]
发表于 2013-03-14 13:13 |只看该作者
本帖最后由 shang2010 于 2013-03-14 13:18 编辑

我的解答是递归,
table[][]=
0=>8
1=>2,4
2=>135
...

//key当前[号码位],n后面跟随[位数]
int foo(int key, int n)
{
if(n=0) return 1;//没有跟随位了,基本号码一个算一,
foreach v as table(key)
  sum =+ foo(v, n-1);
return sum;
}

===
echo foo(0,7) \
+(foo(1,7)+foo(4,7)+foo(7,7))x2 \
+ foo(2,7) +foo(5, 7) + foo(8,7);




==
考试环节貌似可以用伪代码的吧

论坛徽章:
154
2022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:5720周年集字徽章-年
日期:2022-10-26 16:44:2015-16赛季CBA联赛之深圳
日期:2022-11-02 14:02:4515-16赛季CBA联赛之八一
日期:2022-11-28 12:07:4820周年集字徽章-20	
日期:2023-07-19 08:49:4515-16赛季CBA联赛之八一
日期:2023-11-04 19:23:5115-16赛季CBA联赛之广夏
日期:2023-12-13 18:09:34
16 [报告]
发表于 2013-03-14 13:15 |只看该作者
本帖最后由 shang2010 于 2013-03-15 17:30 编辑

回复 5# hisptoot


    你这个情况不麻烦,加个全局变量回答你的问题

在foo中,当n=0, key=0时,全局变量计数



唯一可惜的是,做递归代码优化时,代码结构会更加复杂

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
17 [报告]
发表于 2013-03-14 13:35 |只看该作者
本帖最后由 bruceteen 于 2013-03-14 13:41 编辑
shang2010 发表于 2013-03-14 12:52
回复 10# bruceteen
题目有点理解不对,三个8后面(第四位)可以是任何数字,不受“将步”限制;所以还请高手再来一下

我想想先。。。。。。。。。。。

论坛徽章:
154
2022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:5720周年集字徽章-年
日期:2022-10-26 16:44:2015-16赛季CBA联赛之深圳
日期:2022-11-02 14:02:4515-16赛季CBA联赛之八一
日期:2022-11-28 12:07:4820周年集字徽章-20	
日期:2023-07-19 08:49:4515-16赛季CBA联赛之八一
日期:2023-11-04 19:23:5115-16赛季CBA联赛之广夏
日期:2023-12-13 18:09:34
18 [报告]
发表于 2013-03-14 13:37 |只看该作者
发现现在代码风格,c/php已经绞不清了

论坛徽章:
0
19 [报告]
发表于 2013-03-14 13:42 |只看该作者
43038个是生成9位数字时候的情况

LZ的题目里面是生成8位数字

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
20 [报告]
发表于 2013-03-14 13:46 |只看该作者
shang2010 发表于 2013-03-14 12:52
回复 10# bruceteen
题目有点理解不对,三个8后面(第四位)可以是任何数字,不受“将步”限制;所以还请高手再来一下

刚才弄错了,应该是将
printf( "%d\n", foo(8,0) );
改为
printf( "%d\n", foo(0,1)+foo(1,1)+foo(2,1)+foo(3,1)+foo(4,1)+foo(5,1)+foo(6,1)+foo(7,1)+foo(8,1)+foo(9,1) );
就行了,如果这样理解的话,结果输出是 14826
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP