读书人

有些难度的算法有关问题

发布时间: 2012-03-07 09:13:51 作者: rapoo

有些难度的算法问题!
这到题本人想了许久终究未想出合适算法,还请高手指点!
背景:
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

[解决办法]
先找出相邻两个递增数字交换后增加的数跟两个数的差以及两个数后面数字个数的关系(应该跟后面数字个数的阶乘相关)。
把要加的数拆成不同阶乘的和。
交换原始数列的某些相邻数字。

具体还没想好,下班再想
[解决办法]
//我的基本思想是从后往前扫描,如果当前位值 this 比前一个值 front大,就要进行元素交换,且值加一,
//因为 this 往后都是从大到小排列的,还要比较前一个值 front 是否比最后一个值 end 要小,
//如果是则先将从this...end逆序:如:1 2 3 6 5 4 要加一,因为 6 > 3 && 4 > 3则: 1 2 3 6 5 4
//-> 1 2 3 4 5 6 -> 1 2 4 3 5 6。如此类推。

//没有大量测试数据不知效率如何,还请高手指教。呵呵
#include <iostream.h>

int main()
{
int N;
while (cin > > N) //Ctrl + Z 结束
{
int *point = new int[N];
for (int i = 0; i < N; i++)
{
cin > > point[i];
}

int add;
cin > > add;
for (int j = 1; j <= add; j++)
{
for (int k = N - 1; k > = 1; k--)
{
if(point[k] > point[k - 1])
{
if (point[k - 1] < point[N - 1])
{
//将尾部数组逆序
for (int head = k, end = N - 1; end > head; head++, end--)
{
int temp = point[head];
point[head] = point[end];
point[end] = temp;
}
int tem = point[k - 1];
point[k - 1] = point[k];
point[k] = tem;
}
else
{
int te = point[k - 1];
point[k - 1] = point[k];
point[k] = te;
}

break;
}
}
}

for (int s = 0; s < N; s++)
{
cout < < point[s] < < " ";
}

delete [] point;

}
return 0;
}

读书人网 >C语言

热点推荐