長度為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 這幾個數字說的都是下標 不會垮區間選數,那麼我們就可...