51nod 首尾排序法 01

2021-09-11 08:31:18 字數 1072 閱讀 2370

題意:有乙個長度為n的陣列 p1, p2, p3, ⋯, pnp1, p2, p3, ⋯, pn ,裡面只包含1到n的整數,且每個數字都不一樣。現在要對這個陣列進行從小到大排序,排序的時候只能是把乙個數字拿過來放到陣列末尾或者開頭,問最少要操作幾次才能使得這個陣列從小到大排序

輸入要求:第一行乙個整數n (1≤n≤100000),表示陣列的長度。 第二行有n個整數 pi (1≤pi≤n, 如果 i≠j,那麼pi≠pj ) ,表示陣列中的數字

舉例:輸入

5 4 1 2 5 3

先將4放到末尾,再將5放置末尾即可,需2步。

思路: 動態規劃,求出陣列的最大有序序列長度len(這裡的有序並非連續有序,而只要從小到大排列),然後將總長n-len即為最少移動次數。具體演算法見**。

**:

/**

@ 51nod_首尾排序法

求出最長的連續的子串(樣例1,2,3)的長度len。

*/#include #include #include #include #include using namespace std;

const int maxn = 100001;

int dp[maxn]; //最大連續長度

int a[maxn];

int p[maxn]; //當前值的前一元素值

bool visit[maxn];

int dfs(int i)

int temp = p[i];

if(dp[temp])

//return dfs(temp);

}int main() {

int n;

scanf("%d",&n);

for(int i = 0;i結果:

51 Nod 1700 首尾排序法

有乙個長度為n的陣列 p1,p2,p3,pnp1,p2,p3,pn 裡面只包含1到n的整數,且每個數字都不一樣。現在要對這個陣列進行從小到大排序,排序的時候只能是把乙個數字拿過來放到陣列末尾或者開頭,問最少要操作幾次才能使得這個陣列從小到大排序。樣例解釋 先把4移動到最後,然後再把5移動到後。收起單...

51nod 貪心入門

有若干個活動,第i個開始時間和結束時間是 si,fi 活動之間不能交疊,要把活動都安排完,至少需要幾個教室?分析 能否按照之一問題的解法,每個教室安排盡可能多的活動,即按結束時間排序,再貪心選擇不衝突的活動,安排乙個教室之後,剩餘的活動再分配乙個教室,繼續貪心選擇 反例 a 1,2 b 1,4 c ...

51nod 迷宮問題

1459 迷宮遊戲 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 你來到乙個迷宮前。該迷宮由若干個房間組成,每個房間都有乙個得分,第一次進入這個房間,你就可以得到這個分數。還有若干雙向道路鏈結這些房間,你沿著這些道路從乙個房間走到另外乙個房間需要一些時間。遊戲規定了你的...