有些难度的算法问题!

cseek 2007-09-10 01:22:43
这到题本人想了许久终究未想出合适算法,还请高手指点!
背景:
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
...全文
2631 63 打赏 收藏 转发到动态 举报
写回复
用AI写文章
63 条回复
切换为时间正序
请发表友善的回复…
发表回复
silencezhujianhua 2007-12-19
  • 打赏
  • 举报
回复
顶一下啊
看不懂
firefly123 2007-12-19
  • 打赏
  • 举报
回复
我的做法和cseek一样
wangwang1103 2007-12-19
  • 打赏
  • 举报
回复
我想这个可能跟阶乘计数有关:
n = ∑X(i-1)! + ∑(i-1)! i是n从地位到高位的位数,从1开始到n。
X = (ai-1+j) j表示有j个数字,他们是n到i+1位上面的数字 而且这些数字大于i为上面的数字。
charloco 2007-10-12
  • 打赏
  • 举报
回复
我的理解:
这批数被分成了两部分,一部分是升序,另一半是降序(或者是两段升序)。每加1就要调整序列。最末尾的当然是降序中最小的,从最后开始向前遍历,找到比它好要小的数(假设位置为k),交换(swap(num[k],num[end]),并把[k+1,end]中数调为升序(这个时候数据被分成了两端升序的了)。
最后的结果当然是一个降序排列了,在加数就要溢出了。
thecorr 2007-10-11
  • 打赏
  • 举报
回复
标记下
Anne_Mike 2007-10-11
  • 打赏
  • 举报
回复
看不明白啥意思
zxg623 2007-10-04
  • 打赏
  • 举报
回复
zxg623 2007-10-04
  • 打赏
  • 举报
回复
上面有些错误,我改了一下!!




我的算法:

样例输入:
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
这样扩展完成了,然后在计算!

假如上面输入的是不规则数列,还需计算不规则数列所代表的数值!这里就不再说明了!
zxg623 2007-10-04
  • 打赏
  • 举报
回复
我的算法:

样例输入:
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
交换4和前一位(即3)得到:
2 1 3
1
再交换5和前一位(即3)得到:
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
这样扩展完成了,然后在计算!

假如上面输入的是不规则数列,还需计算不规则数列所代表的数值!这里就不再说明了!
Jackiezhw 2007-10-04
  • 打赏
  • 举报
回复
外星表示法的描述不够清楚,至少应该把4个数的写完
Jackiezhw 2007-10-03
  • 打赏
  • 举报
回复
计数规律描述的不够清楚,至少应该把4个数的外星表示法写完
gristotle 2007-09-16
  • 打赏
  • 举报
回复
大家好 本人用递归写成了一个算法 明天再说吧 今天得睡了
gristotle 2007-09-12
  • 打赏
  • 举报
回复
我们可以对数字加减实现这个数字串的加法么
DreamerX2004 2007-09-12
  • 打赏
  • 举报
回复
我是算法菜鸟,看高手过招长长见识,关注中!
nextflying 2007-09-12
  • 打赏
  • 举报
回复
顶,关注……
sliuyin 2007-09-12
  • 打赏
  • 举报
回复
对不起,因该是1!+2!+...+(n-1)!+序号
sliuyin 2007-09-12
  • 打赏
  • 举报
回复
笔误写错 序号2143的序号是8,所以 值是 17
sliuyin 2007-09-12
  • 打赏
  • 举报
回复
一个常用问题的变种
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
设n个数 , 既1到n-1中每个全排列,既是记数从(n-1)平方算起.

而第n种目标排列的值就是该排列树深度搜索叶子结点的序号.

例如 数 2 1 4 3
n=4;
(n-1)平方=9 既是记数从10开始
然后建立一棵4个数(1234)排列树([]为度搜索叶子结点的序号)
(0)
(1) (2) (3) (4)
(2) (3) (4) (1) (3) (4) (1) (2) (4) (1) (2) (3)
(3)(4) (2)(4) (2)(3) (3)(4) (1)(4) (1)(3) (2)(4) (1)(4) (1)(2) (2)(3) (1)(3) 1,2
(4)(3) (4)(2) (3)(2) (4)(3) (4)(1) (3)(1) (4)(2) (4)(1) (2)(1) (3)(2) (3)(1) 2,1
[1][2] [3][4] [5][6] [7][8] [9][10] 11 12 13 14 15 16 17 18 19 20 21 22 23 24
那么 2 1 4 3的值=序号(7)+n-1平方(9)=16
既然数值都能计算了,这题就解决了
gxdl5460 2007-09-12
  • 打赏
  • 举报
回复
//不好意思,昨天给出的程序要改动一下,只有else{}中要如下更改:

else
{
//找到比 point[k - 1] 大 1 的元素与它交换
for (int z = N - 1; z >= k; z--)
{
if (point[z] == (point[k - 1] + 1))
{
int te = point[k - 1];
point[k - 1] = point[z];
point[z] = te;
}
}
//将尾部数组逆序
for (int head = k, end = N - 1; end > head; head++, end--)
{
int temp = point[head];
point[head] = point[end];
point[end] = temp;
}

}
TAOBO2 2007-09-11
  • 打赏
  • 举报
回复
变进制数啊
每个排列
加载更多回复(43)

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧