题意:
有一个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 }