hdu 5500 Reorder the Books(规律)

题意:

  有一个1→n的排列形成的数列,我们要用最少的操作次数把这个数列从小到大排序,每次操作都是把一个数放到整个数列的最前面。

思路:

       首先最大的数n是不用操作的(其他数操作好了,n自然在最后面了)。先找到数n的位置,在n之前找n-1,若没找到n-1,则n-1需要操作,所有小于n-1的数均需要操作;若找到了n-1,再接着往前依次找n-2,n-3,。。。假如数k找不到了,那就是至少需要k次操作。

复杂度O(n)。

 1 #pragma comment(linker, "/STACK:1024000000,1024000000")
 2 #include<iostream>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<math.h>
 7 #include<algorithm>
 8 #include<queue>
 9 #include<set>
10 #include<bitset>
11 #include<map>
12 #include<vector>
13 #include<stdlib.h>
14 #include <stack>
15 using namespace std;
16 #define PI acos(-1.0)
17 #define max(a,b) (a) > (b) ? (a) : (b)
18 #define min(a,b) (a) < (b) ? (a) : (b)
19 #define ll long long
20 #define eps 1e-10
21 #define MOD 1000000007
22 #define N 26
23 #define inf 1e12
24 int n;
25 int a[N];
26 int main()
27 {
28    int t;
29    scanf("%d",&t);
30    while(t--){
31        scanf("%d",&n);
32        for(int i=0;i<n;i++){
33            scanf("%d",&a[i]);
34        }
35        int ans=n;
36        int ed=n-1;
37 
38        while(ed>=0){
39            if(a[ed]==ans) ans--;
40            ed--;
41        }
42        printf("%d
",ans);
43    }
44     return 0;
45 }
View Code
原文地址:https://www.cnblogs.com/UniqueColor/p/4884622.html