51nod 1153 選擇子串行

2021-08-06 06:43:13 字數 1104 閱讀 6424

長度為n的整數陣列a,所有的數均不相同,假設下標從0開始。找到乙個最長的陣列b,b陣列的長度為k,數值範圍是0 - n - 1,記錄的是a陣列的下標。滿足a[b[0]] > a[b[1]] > a[b[2]] >...a[b[k]],並且對任意連續的兩項b[i]及b[i + 1],滿足min(b[i],b[i + 1]) < j < max(b[i],b[i + 1]) 均有a[j] < a[b[i + 1]] ,求最大的k。例如:9, 10, 2, -1, 3, -5, 0, -3, 1, 12, 5, 8, -2, 6, 4。可以選出:12, 10, 3, 1, 0, -3。對應的下標為:9, 1, 4, 8, 6, 7(就是b陣列),輸出6。

input

第1行:乙個數n,表示a陣列的長度。(1 <= n <= 50000)

第2 - n + 1行:每行1個數對應a陣列的元素ai(0 < ai < 10^9)

output

輸出b陣列最長的長度k。
input示例

15910

2-13-5

0-3112

58-26

4

output示例

6
思路:

利用單調遞減棧,棧中相鄰兩個值的位置之間的數字必然小於兩個相鄰值的最小值。

#include #include #include using namespace std;

const int size = 50005;

int input[size];

struct node

int val;

int num;

};int main()

num++;

int size = buf.size() + 1;

num = max(num, size);

buf.push(node(a, num));

result = max(result, num);

} cout << result << endl;

return 0;

}

選擇子串行 51Nod 1153

長度為n的整數陣列a,所有的數均不相同,假設下標從0開始。找到乙個最長的陣列b,b陣列的長度為k,數值範圍是0 n 1,記錄的是a陣列的下標。滿足ab 0 ab 1 ab 2 ab k 並且對任意連續的兩項b i 及bi 1 滿足min b i bi 1 j max b i bi 1 均有aj ab...

51nod 1153 選擇子串行

51nod 選擇子串行 這道題是 bunny 學長在給我們的模擬賽中的一道題。食用單調棧,處理每個數 a i 左右第乙個比自己大的數的下標 left i right i 並且建兩條有向邊 i,left i i,right i 處理完畢後得到乙個 dag 然後求此圖的拓撲序。由於都是小數連大數,所以可...

51nod 1153 選擇子串行 (好題)

這個題很不錯。採用貪心的思想 首先考慮到在整個序列中取最大值一定是最優的,也就是說b陣列的第乙個數是a陣列的中最大值的下標。而且通過題意我們發現,一旦選定了某個數就把當前的區間劃分成兩份。比如說第一次選了9,第二次選了10,那麼下一次肯定不會選8 這幾個數字說的都是下標 不會垮區間選數,那麼我們就可...