題目:
乙個陣列的元素為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)。output第2 - n + 1行:每行1個數,對應排列中的元素。
輸出1個數,對應所需的最少移動次數。input示例
525output示例341
2
解題思路:
很好的題目,對於原陣列的乙個子串行,如果ai,ai+1,a+2,a+3的相鄰兩個元素之間的差都為1,那麼剩下的元素
可在(n-子串行的長度)次移動次數完成排序, 為什麼呢,把ai-1移到最前面,接著把ai-2移到最前面.....後面的也同樣
移動。這樣就轉化為求最長的等差為1的等差數列,用dp解決就好,dp[i]為以i為最後元素的等差數列的長度,於是遞推
方程就是dp[i]=dp[i-1]+1。
**:
#include #include #include #include using namespace std;
const int maxn=50000+1000;
int d[maxn];
int main()
cout<
51Nod 1241 特殊的排序
題目傳送門 分析 之前想的是求lis,後面發現這組資料會出問題 3 1 2 4 5 6。其實這裡的lis還應當滿足前後兩個元素的值相差為1。比如上面的最長子串行為 3 4 5 6,而不是1 2 4 5 6。即只需移動1 2即可。即如果n個數最長連續上公升子串行 這裡的連續指數值上連續,即前後相差1 ...
51nod 1241 特殊的排序
1241 特殊的排序 基準時間限制 1 秒 空間限制 131072 kb 分值 80 難度 5級演算法題 乙個陣列的元素為1至n的整數,現在要對這個陣列進行排序,在排序時只能將元素放在陣列的頭部或尾部,問至少需要移動多少個數字,才能完成整個排序過程?例如 2 5 3 4 1 將1移到頭部 1 2 5...
51Nod 1241 特殊的排序
乙個陣列的元素為1至n的整數,現在要對這個陣列進行排序,在排序時只能將元素放在陣列的頭部或尾部,問至少需要移動多少個數字,才能完成整個排序過程?例如 2 5 3 4 1 將1移到頭部 1 2 5 3 4 將5移到尾部 1 2 3 4 5 這樣就排好了,移動了2個元素。給出乙個1 n的排列,輸出完成排...