以下是问题(链接:http://opc.iarcs.org.in/index.php/problems/FINDPERM):
排列1、2、...、N的重新排列称为这些数字的排列。例如,2 4 5 1 7 6 3 8 是1、2、...、8的排列。当然,1 2 3 4 5 6 7 8 也是1、2、...、8的排列。与N的每个排列相关联的是一个名为其逆序序列的正整数序列,长度为N。这个序列的第i个元素是严格小于i且出现在i右侧的数字j的数量。对于排列2 4 5 1 7 6 3 8,逆序序列如下:0 1 0 2 2 1 2 0。第2个元素为1,因为1比2小,并且它在此排列中出现在2的右侧。类似地,第5个元素为2,因为1和3比5小但出现在此排列中5的右侧等等。另一个例子,排列8 7 6 5 4 3 2 1 的逆序序列为0 1 2 3 4 5 6 7。在这个问题中,您将获得一些排列的逆序序列。您的任务是从这个序列中重构排列。
我编写了以下代码:
排列1、2、...、N的重新排列称为这些数字的排列。例如,2 4 5 1 7 6 3 8 是1、2、...、8的排列。当然,1 2 3 4 5 6 7 8 也是1、2、...、8的排列。与N的每个排列相关联的是一个名为其逆序序列的正整数序列,长度为N。这个序列的第i个元素是严格小于i且出现在i右侧的数字j的数量。对于排列2 4 5 1 7 6 3 8,逆序序列如下:0 1 0 2 2 1 2 0。第2个元素为1,因为1比2小,并且它在此排列中出现在2的右侧。类似地,第5个元素为2,因为1和3比5小但出现在此排列中5的右侧等等。另一个例子,排列8 7 6 5 4 3 2 1 的逆序序列为0 1 2 3 4 5 6 7。在这个问题中,您将获得一些排列的逆序序列。您的任务是从这个序列中重构排列。
我编写了以下代码:
#include <iostream>
using namespace std;
void insert(int key, int *array, int value , int size){
int i = 0;
for(i = 0; i < key; i++){
int j = size - i;
array[ j ] = array[ j - 1 ];
}
array[ size - i ] = value;
}
int main(){
int n;
cin >> n;
int array[ n ];
int key;
for( int i = 0; i < n; i++ ){
cin >> key;
insert( key, array, i + 1, i);
}
for(int i = 0;i < n;i ++){
cout << array[i] << " ";
}
return 0;
}
它的工作正常,并为70%的测试用例提供正确答案,但超过了其余部分的时间限制。 是否有其他更快的算法来解决这个问题?