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 }
AC代码

相关文章: