【問題描述】
今有一全排列,每次可以移動一個數,求排序所需最少移動次數。
【輸入格式】
第一行一個正整數N
第二行N 個整數,表示排列
【輸出格式】
輸出一行,爲最少移動次數
【樣例輸入】
5
2 1 4 5 3
【樣例輸出】
2
【數據規模與約定】
50% N<=5e3
100% N<=2e5
今有一全排列,每次可以移動一個數,求排序所需最少移動次數。
這道題體面沒講清楚,應該是排序排成升序最少移動次數,所以只有80
最長上升子序列解決
每個數只能往最右移動或者往最左,這樣的話無論如何肯定是最少的。
解決
PS:今天的題目其實還是挺水的
(測的只有八十分,想ac就把降序那部分去掉)
#include <bits/stdc++.h>
using namespace std;
const int maxn=200010;
int n,s,t,o,a[maxn],b[maxn],f[maxn];
int main()
{
//freopen("cmi.in","r",stdin);
//freopen("cmi.out","w",stdout);
scanf("%d",&n);
a[0]=-1000000;
for(int i=1;i<=n;i++)
{
scanf("%d",&b[i]);
t=b[i];
if(t>a[s]) a[++s]=t;
else
{
int l=1,h=s,m;
while(l<=h)
{
m=(l+h)/2;
if(t>a[m]) l=m+1;
else h=m-1;
}
a[l]=t;
}
}
printf("%d",n-s);
}