特殊的排序

brucehb發表於2017-06-10
一個陣列的元素為1至N的整數,現在要對這個陣列進行排序,在排序時只能將元素放在陣列的頭部或尾部,問至少需要移動多少個數字,才能完成整個排序過程?
例如:
2 5 3 4 1 將1移到頭部 => 
1 2 5 3 4 將5移到尾部 =>
1 2 3 4 5 這樣就排好了,移動了2個元素。

給出一個1-N的排列,輸出完成排序所需的最少移動次數。
Input
第1行:1個數N(2 <= N <= 50000)。
第2 - N + 1行:每行1個數,對應排列中的元素。
Output
輸出1個數,對應所需的最少移動次數。
Input示例
5
2
5
3
4
1
Output示例

2

#include <iostream>
#include <cstring>
using namespace std;

int input[50000];

int fun(int n)
{
    int buf[n+1];
    memset(buf, 0, sizeof(buf));
    int result = 1;
    for (int i = 0; i < n; i++)
    {
        if (buf[input[i]-1] > 0)
        {
            buf[input[i]] = buf[input[i]-1] + 1;       
            if (buf[input[i]] > result)
            {
                result = buf[input[i]];
            }
        }
        else
        {
            buf[input[i]] = 1;
        }
    }
    
    return result;
}

int main()
{
    int n;
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        cin >> input[i];
    }
    cout << n - fun(n) << endl;
    
	return 0;
}


相關文章