题意:
已知一个1到n的排列,每次可以把其中一个数放到最前面,问至少经过多少次操作,可以使这个排列变为升序。
特别有趣的题...
我们可以发现,处于原排列的一段 (1)以n结尾 (2)大小相邻(可以不连续)的子序列,是没有必要去操作的。
比如1 3 2 4 5中,可以找到3 4 5这个子序列。
我们通过操作其他的数字,上面这个例子里就是1和2,达到最终排序的效果。
显然一个n排列,最多只需要n次操作就可以完成排序。
设满足性质的子序列的长度为x,我们没有必要去操作这个子序列,去操作其他的数字就可以。
那么最后答案就是n - x。
#include <cstdio>
const int maxn = 300005;
int n, num[maxn];
inline int iread() {
int f = 1, x = 0; char ch = getchar();
for(; ch < '0' || ch > '9'; ch = getchar()) f = ch == '-' ? -1 : 1;
for(; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
return f * x;
}
int main() {
n = iread();
for(int i = 1; i <= n; i++) num[i] = iread();
int ans = n;
for(int i = n; i >= 1; i--) if(num[i] == ans) ans--;
printf("%d\n", ans);
return 0;
}