njupt 字典序最大的出棧序列

2021-06-17 00:21:08 字數 1020 閱讀 4889

題意:給出入棧序列,保證各個元素值各不相等,輸出字典序最大的出棧序列.

如入棧序列 = 1, 2, 9, 4, 6, 5

則字典序最大的出棧序列為9, 6, 5, 4, 2 1

/*棧的性質就是先進後出,所以對於依次入棧的兩個元素a,b,有兩種情況:

<1>先壓a進棧,不彈出,再壓b進棧,則最終的出棧序列a一定位於b之後。

<2>要想a位於b之前,則只能在b進棧之前把a彈出。

所以求字典序最大的出棧序列,就可以根據這一性質來搞。。設rmax[i] 為區間[i, n]中最大元素,而max_pos則記錄該元素的位置。

<1>初始l=1

<2>若棧為空,則直接壓入當前元素

若棧頂元素s.top() 比區間[l, n]的最大元素rmax[l]值小,則應該把當前元素到max_pos[l]的這段全都壓入棧(即區間[i, max_pos[l]]),然後pop出此時的棧頂元素,其實也就是rmax[l]. 接著新的l = max_pos[l] + 1.

若s.top() > rmax[l],則棧頂元素出棧,l不變。

<3>重複<2>

*/#include #include#includeusing namespace std;

const int n = 128;

stackstk;

int n, a[n], rmax[n], max_pos[n];

int main() {

scanf("%d", &n);

for(int i = 0; i < n; ++i) scanf("%d", a+i);

for(int i = n-1; i >= 0; --i)

if(rmax[i+1] > a[i]) rmax[i] = rmax[i+1], max_pos[i] = max_pos[i+1];

else rmax[i] = a[i], max_pos[i] = i;

for(int j = 0, i = 0; i < n; ++i) {

if(stk.empty() || stk.top()

字典序最大的子串行

給定字串s,s只包含小寫字母,請求出字典序最大的子串行。子串行 字典序 一行乙個字串s 1 s 100,000 字典序最大的子串行。示例1 ababba bbba 示例2abbcbccacbbcbaaba cccccbba 題解 從左往右掃一遍找到第乙個最大的字母。從後往前掃,如果前面的字母大於等於...

1718 構建字典序最大的可行序列

題目描述 給你乙個整數 n 請你找到滿足下面條件的乙個序列 整數 1 在序列中只出現一次。2 到 n 之間每個整數都恰好出現兩次。對於每個 2 到 n 之間的整數 i 兩個 i 之間出現的距離恰好為 i 序列裡面兩個數 a i 和 a j 之間的 距離 我們定義為它們下標絕對值之差 j i 請你返回...

可能的出棧序列問題

首先的前提是進棧一定是要按照順序進棧如1 2 3 4的順序,如果第乙個出的是4,那麼要依次先進棧1 2 3 4,然後出棧,這樣的話第乙個是4,沒有其他的元素可以再進棧了,所以只能按順序出棧,這樣出棧的順序就是4 3 2 1。假如出棧的順序是3 4 2 1,你就要先分析出3的情況,只有先將1 2 3入...