CIM
题目
给出一个1到n的排列,每次可以移动一个数到一个任意位置。问要达到状态1,2,3……n至少移动多少次?
输入
n个数(1<=n<=100000)
输出
移动次数!
Sample Input
5
2 1 4 5 3
Sample Output
2
解析
这道题看上去是无解的:模拟时间不够,n<=100000
但是如果我们透过现象看本质,科学家的好苗子仔细观察,就会发现:答案就是n-最长上升子序列的长度!(原因:目标其实就是一个长度为N的上升子序列,移动一次最多能使最长上升子序列的长度+1)
So,我们拿出了第一份代码:
#include<iostream>
#include<cstdio>
using namespace std;
int n,m=1,a[100001],s[100001];
int main()
{
cin>>n;
for(int i=