题目大意
给出一个长度为n的排列,每次操作可以将其中一个数放到最前面,问至少要多少次操作将该序列改成单调递增序列。
n<=100000
时间限制 1s
空间限制 64M
解题思路
如果我们把一个数k放到最前面,那么比k小的数在接下来就都要操作一次,而我们可以用这k-1次操作把1~k摆好,于是问题就变成了找出最大的k,使它在k+1的后面。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxm 26
#define maxn 100006
#define fr(i,a,b) for(i=a;i<=b;i++)
using namespace std;
typedef long long ll;
int T,i,n,ans,a[maxn],pos[maxn];
int main()
{
freopen("book.in","r",stdin);
freopen("book.out","w",stdout);
scanf("%d",&T);
while (T--)
{
scanf("%d",&n);
fr(i,1,n) scanf("%d",&a[i]),pos[a[i]]=i;
ans=0;
for(i=n;i>1;i--)
if (pos[i-1]>pos[i])
{
ans+=i-1;
break;
}
printf("%d\n",ans);
}
return 0;
}