题意:
给定一个1-N的排列A1, A2, ... AN,每次操作小Hi可以选择一个数,把它放到数组的最左边。
请计算小Hi最少进行几次操作就能使得新数组是递增排列的。
思路:
这种题做过很多次了,就是换了个问法,本质都一样.可这次还是想了好久。。
这个题的话因为要求最小的操作数,而且要是严格递增的,由于每次只能放在最左边,所以我们想到逆着来做,从后往前,
从最大的开始,一定存在某个数只需要移动一次就可以.而且最多一共移动n次,如果当前的数满足递增序列的末尾,那么就
不需要移动,就把移动的次数-1,其他数来移动不会影响他的顺序.
#include<bits/stdc++.h>
#define Ri(a) scanf("%d", &a)
#define Rl(a) scanf("%lld", &a)
#define Rf(a) scanf("%lf", &a)
#define Rs(a) scanf("%s", a)
#define Pi(a) printf("%d\n", (a))
#define Pf(a) printf("%lf\n", (a))
#define Pl(a) printf("%lld\n", (a))
#define Ps(a) printf("%s\n", (a))
#define W(a) while(a--)
#define CLR(a, b) memset(a, (b), sizeof(a))
#define MOD 1000000007
#define inf 0x3f3f3f3f
#define exp 0.00000001
#define pii pair<int, int>
#define mp make_pair
#define pb push_back
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
int a[maxn];
int n;
int main()
{
Ri(n);
for(int i=1;i<=n;i++)
{
Ri(a[i]);
}
int ans=n;
for(int i=n;i>=1;i--)
{
if(a[i]==n)
{
n--;
ans--;
}
}
Pi(ans);
return 0;
}