cmi(最長上升子序列妙用)

【問題描述】
今有一全排列,每次可以移動一個數,求排序所需最少移動次數。
【輸入格式】
第一行一個正整數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);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章