Description
每次选择序列最左边的数,然后将其插入到序列中任意一个位置。求至少需要重复进行多少次上述操作,才可以将序列变为一个递增序列。
Input
输入的第一行包含一个整数T (T > 0),表示一共有T组测试数据. 对于每组测试数据,第一行包含一个整数n (1 ≤ n ≤ 105),表示这个序列中一共有n个整数。第二行包含n个各不相同的整数(这些整数均在[1, 109]范围内),依次描述了这个序列中的各个数。 Output
对于每组测试数据,输出一个整数,表示至少需要重复进行多少次上述操作,才可以将这个序列变为一个递增序列。
Sample Input
3
3
1 2 3
3
1 3 2
5
1 5 4 3 2
Sample Output
0
2
4
题中又说每次从最左侧移动,所以这一元素包括它本身之前的所有元素都需要移动,那么直接跳出输出此时数组下标即可
//AC.
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
long long int a[100005];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
memset(a,0,sizeof(a));
scanf("%d",&n);
int m=0,k=n-1;
while(m<n)
{
scanf("%lld",a+(m++));
}
while(a[m-1]>a[m-2]&&(m-2)>-1)
{
m--; //当a[m-1]〉a[m-2]说明a[m-2]不需要移动,反之包括a[m-2]在内及之前的所有元素都需要移动,共m-2+1个
}
printf("%d\n",m-1);
}
return 0;
}