分类: 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
1
交换2和前一位(即1)得到:
2 1 3
1
再交换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
交换1和最后一位(即3)得到:
3 2 1
1
这里的交换和前面的都一样,再交换1和前一位(即2)得到:
3 1 2
即为最后输出结果!
还有当数字超出了输入样例的统计范围时候,要进行样例的重新扩展。
例如:
样例输入:
3
53
1 2 3
由于1 2 3 是从1开始按从小到大排列的连续数,我们在这里称为规则数列。它所代表的数字是∑(n-1)!+1=4(这里的n为输入的第一行数3,即为位数),4+53=57,然后计算扩展后的位数N,∑(N-1)! <57 <∑N!,得到N=5。
即为:1 2 3 4 5 代表的数字为∑(n-1)!+1=34
转化为标准行样例输入:
5
57-34=23
1 2 3 4 5
这样扩展完成了,然后在计算!
假如上面输入的是不规则数列,还需计算不规则数列所代表的数值!这里就不再说明了!