題意:有乙個長度為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 難度 基礎題 你來到乙個迷宮前。該迷宮由若干個房間組成,每個房間都有乙個得分,第一次進入這個房間,你就可以得到這個分數。還有若干雙向道路鏈結這些房間,你沿著這些道路從乙個房間走到另外乙個房間需要一些時間。遊戲規定了你的...