ここに質問があります(リンク:http://opc.iarcs.org.in/index.php/problems/FINDPERM):
数1、...、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の数です。順列245
1 7 6 3 8
の場合、反転シーケンスは
0 1 0 2 2 120です。
2番目の要素は1です。これは、1が厳密に2未満であり、この順列では2の右側に表示されるためです。同様に、1と3は厳密に5未満であるため、5番目の要素は2ですが、この順列では5の右側に表示されます。
別の例として、順列
8 7 6 5 4 321の反転シーケンス
は012
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%に対して正解を示していますが、残りの時間制限を超えています。この質問を解決するための他のより高速なアルゴリズムはありますか?