Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1507710
  • 博文数量: 213
  • 博客积分: 10418
  • 博客等级: 上将
  • 技术积分: 3358
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-09 23:49
文章分类

全部博文(213)

文章存档

2014年(1)

2013年(5)

2012年(11)

2011年(2)

2010年(8)

2009年(26)

2008年(160)

分类: C/C++

2008-04-10 23:28:35

这到题本人想了许久终究未想出合适算法,还请高手指点!
背景:

2036
年,人类探测器猎豹X到达了木星的第二颗卫星——木卫二。探测器上的防生学智能机器人传达给科学家一个重要情报——它们发现了高智能生命
...
描述:

高智能生命与人类有着不同的数学计数法,他们用几个数字的排列就可以表达出丰富的数字世界:

计数的规律如下:

1        
代表
1
1   2        
代表
2
2   1        
代表
3
1   2   3        
代表
4
1   3   2        
代表
5
2   1   3        
代表
6
2   3   1        
代表
7
3   1   2        
代表
8
3   2   1        
代表
9
1   2   3   4        
代表
10
..............
由于需要交流,人类需要对木卫高智能生命给出的数字进行识别、处理和   加法   计算,所以需要你的帮助

输入:

使用文件输入,输入文件名:
count.in
共三行

第一行是一个数N,代表他们给出的数字的数字个数

例如:

他们给出数字1   2   3   4   5   那么第一行的数据就为
5
第二行为一个需要加的数,那个数字是科学家给出的,因此是一个10进制的普通数,例如
3
第三行为高智能生命的计数,例如
1   2   3   4   5
输出:

使用文件输出,输出文件名
:count.out
共一行,为经过加法计算后的高智能生命计数,如
1   2   4   5   3
样例输入:

5
3
1   2   3   4   5
样例输出
:
1   2   4   5   3
数据规模
:
对于30%的数据,N <=15

对于60%的数据,N <=50

对于全部的数据,N <=10000

为降低难度,保证输入的高智能生命计数与输出结果的位数相同,即保证不会出现

input:
1
8
1
output:
3   2   1
测试时间
:
每个测试点限时1秒。

内存限制:

65536KB 

 

 

我的算法: 

样例输入:
  
3  
3  
1   2   3 
样例输出
:  
2   3   1 

由于3的二进制数字是11
 
样例输入:
      1   2   3 
样例输出
:       2   3   1 
3
的二进制:
        1   1 
3的二进制位为1的时候就交换相应的位,为0的时候不操作(注意从高位开始)
 
对上面的计算过程进行分析:
 
样例输入:
      1   2   3  
                   
交换2和前一位(即1)得到:
 
                2   1   3 
                       
再交换3和前一位(即1)得到:
 
                2   3   1 
即为最后输出结果!
 

当转化的二进制数字(比如上面3的二进制11)的位数和样例的数字位数相同时要对算法修正;
 
例如:
 
样例输入:
  
3  
5  
1   2   3 
样例输出
:  
3   2   1 

由于5的二进制数字是101
 
样例输入:
      1   2   3 
样例输出
:       3   2   1 
5
的二进制:
    1   0   1 
3的二进制位为1的时候就交换相应的位,为0的时候不操作(注意从高位开始)
 
对上面的计算过程进行分析:
 
样例输入:
      1   2   3  
               
交换1和最后一位(即3)得到:
 
                3   2   1 
                       
这里的交换和前面的都一样,再交换1和前一位(即2)得到:
 
                3   1   2 
即为最后输出结果!
 


还有当数字超出了输入样例的统计范围时候,要进行样例的重新扩展。
 
例如:
 
样例输入:
  
3  
53 
1   2   3 
由于1   2   3 是从1开始按从小到大排列的连续数,我们在这里称为规则数列。它所代表的数字是n1)!+14(这里的n为输入的第一行数3,即为位数),45357,然后计算扩展后的位数NN1)!  <57  <∑N,得到N5
 
即为:1   2   3   4    5    代表的数字为n1)!+1
34 

转化为标准行样例输入:
 

57
34
23 
1   2   3   4    5 
这样扩展完成了,然后在计算!
 

假如上面输入的是不规则数列,还需计算不规则数列所代表的数值!这里就不再说明了!

阅读(1018) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~