T1 题意:你要进行n次操作,第i次选择一个数k∈[1,i],并插入到当前序列的第k个位置。给定目标序列,输出操作序列。100,2s。
解:冷静分析一波,我们可以从后往前确定操作序列。这样每次确定一个操作之后就会删除一个数。
如果有ai = i的位置那我们显然可以把这个i操作放到操作序列最后。如果有多个这样的i,从后往前处理。
1 #include <bits/stdc++.h> 2 3 const int N = 110; 4 5 int a[N], b[N]; 6 7 int main() { 8 9 int n; 10 scanf("%d", &n); 11 for(int i = 1; i <= n; i++) { 12 scanf("%d", &b[i]); 13 } 14 for(int i = n; i >= 1; i--) { 15 bool f = 0; 16 for(int j = i; j >= 1; j--) { 17 if(b[j] > j) break; 18 if(b[j] == j) { 19 a[i] = j; 20 //printf("a %d = %d \n", i, j); 21 for(int k = j; k < i; k++) { 22 b[k] = b[k + 1]; 23 } 24 f = 1; 25 break; 26 } 27 } 28 if(!f) { 29 printf("-1"); 30 return 0; 31 } 32 } 33 for(int i = 1; i <= n; i++) { 34 printf("%d\n", a[i]); 35 } 36 return 0; 37 }