特殊的排列

2022-05-27 13:27:13 字數 1259 閱讀 9946

【題目描述】

乙個陣列的元素為 1 至 n 的整數,現在要對這個陣列進行排序,在排序時只能將元素放在陣列的頭部或尾部,問至少需要移動多少個數字,才能完成整個排序過程?

2 5 3 4 1 將 1 移到頭部 ⇒

1 2 5 3 4 將 5 移到尾部 ⇒

1 2 3 4 5 這樣就排好了,移動了 2 個元素。

給出乙個 1-n 的排列,輸出完成排序所需的最少移動次數。

【輸入格式】

第 1 行:1 個數 \(n(2\leq n\leq 50000)\)。

第 2 ~ n+1 行:每行 1 個數,對應排列中的元素。

【輸出格式】

輸出 1 個數,對應所需的最少移動次數。

考試的時候 把結論猜對了 不然我估計我也推不出這個結論來qwq

結論是這樣的

假設你以最少的移動次數排好了序 那麼你一定會將1~p的這些數按照p, p-1, p-2, ..., 2, 1的順序依次挪到最前面 將q~n的數按q, q+1, q+2, ..., n - 1, n的順序挪到最後面

這樣移動的所需次數一定是最少的

那麼還有一部分數 p+1~q-1 是不需要移動的 為了讓移動次數最少 我們肯定想要這段 p+1~q-1 最長

這段數字還必須是連續的正整數 所以問題就變成了求序列中最長的 由連續正整數構成的 子串行

這個其實也很容易求 設\(ind[i]\)表示 數字\(i\)在序列中的位置 以上文樣例為例 \(ind\)陣列應該是這樣的:\(\\) 然後其實就是求這個陣列的最長連續上公升子串行 遍歷一遍就行了 時間複雜度\(o(n)\)

#include #include #include using namespace std;

typedef long long ll;

ll read()

while (ch <= '9' && ch >= '0')

return ret * flag;

}ll n, a[100005], b[100005];

ll maxn, maxst;

int main()

ll st = 1;

for (int i = 2; i <= n; i++)

st = i;

} } if (n - st + 1 > maxn) maxn = n - st + 1;

printf("%lld\n", n - maxn);

return 0;

}

特殊排列 二分 插入

有n個元素,編號1.2 n,每一對元素之間的大小關係是確定的,關係具有反對稱性,但不具有傳遞性。注意 不存在兩個元素大小相等的情況。也就是說,元素的大小關係是n個點與n n 1 2條有向邊構成的任意有向圖。然而,這是一道互動式試題,這些關係不能一次性得知,你必須通過不超過10000次提問來獲取資訊,...

css 特殊性 權重排列

首先類似於二進位制的理解。0010大於0001。id 0,1,0,0 class,屬性值 偽類 0,0,1,0 元素 偽元素 0,0,0,1 偽元素 before after,first line,first letter 0,0,0,1 0,0,0,0 大於繼承值 important 就像 1,0...

藍橋杯 特殊回文數(帶限制的全排列)遞迴解法

123321是乙個非常特殊的數,它從左邊讀和從右邊讀是一樣的。輸入乙個正整數n,程式設計求所有這樣的五位和六位十進位制數,滿足各位數字之和等於n 輸入一行,包含乙個正整數n。按從小到大的順序輸出滿足條件的整數,每個整數佔一行。1 n 54。include using namespace std in...