牛客網 間單排序(LIS演算法)

2021-09-12 19:13:59 字數 1255 閱讀 5710

lxk有乙個序列,從n~1,但是他不小心把序列打亂了,現在他想找你把這串串行復原。

他討厭用傳統的方式排序。所以他用他自己的方式進行復原。

他有k個先進先出的佇列

對於某個數字,你可以選擇將其放入任意佇列之中(不能不放)。

每個佇列中隊首的數字可以在任意時間出佇列。

利用這些佇列,聰明的lxk就可以將序列復原回降序。

他想知道這些操作最少需要準備多少個佇列?    

乙個數n(n<100000)

表示數字的數目

接下來一行 n個數字

乙個數k

表示最少需要多少個佇列才能滿足要求

示例1

複製

5

1 2 3 4 5

複製

5
示例2

複製

7

1 2 5 7 3 4 6

複製

5

題解:因為佇列是先進先出後進後出,按照最優的方法新增佇列只需要把小的數放在大的數後面,所以我們只需要判斷從開始到最後的單調遞增的子串行有多長因為中間的數一定有與之對應的佇列可以存放。

lis:思想就是新生成乙個陣列 dp 用於存放單調遞增的子串行,遍歷原陣列 arry 並判度 arry[i]>dp[len] ?如果是就將arry[i] 放入dp[++len] 中。否則在dp中找到第乙個大於等於arry[i]的值並將其替換掉。具體如下:

當遍歷到i=5時此時:

arry:  1 2 5 7 3 4 6

dp:    1 2 5 7 

進行替換:

dp:    1 2 3 7 

當遍歷到i=6時

進行替換:

dp:    1 2 3 4

所以進行替換的目的是為了能將裡面大的值替換掉,以便於小的值加入這樣就可以增加其長度。因為替換的位置本身就會大於左邊小於右邊所以不會有什麼影響。

注意:這樣做只會得到單調遞增子串行的長度並不會得到子串行的具體值。

#include#define clr(a,b) memset(a,b,sizeof(a))

using namespace std;

const int maxn=100000+1;

int n,arry[maxn],dp[maxn];

int lis()

else

}return len+1;

}int main()

cout

}

牛客 簡單排序 (STL)

首先將一系列數存入到陣列中,然後利用set的upper bound返回第乙個大於他的函式,如果存在這樣的,就把大於他的那個數刪除,加入這個新的數,否則就表示序列中沒有大於他的數,把他加入set中 include include using namespace std const int maxn 1...

簡單排序演算法

package com.shine.sort 排序演算法 說明 排序演算法分為三種 插入排序 交換排序 選擇排序 1.插入排序 直接插入排序 折半插入排序 希爾排序 2.交換排序 氣泡排序 快速排序 3.選擇排序 直接選擇排序 堆排序 public class mysort 希爾排序 描述 1.將乙...

簡單排序演算法

演算法思想 將初始序列 a 0 a n 1 作為待排序序列,第一趟在待排序序列 a 0 a n 1 中找最小值元素,與該序列中第乙個元素a 0 交換,這樣的子串行 a 0 有序,下一趟排序在待排序子串行 a 1 a n 1 中進行。第i趟排序在待排序子串行 a i 1 a n 1 中,找最小值元素,...