2018 9 26 2018NOIP衝刺之棧

2022-05-08 20:27:09 字數 1795 閱讀 3426

最小字典序(stack)

輸入序列中有 n 個正整數,棧 s 開始為空。

你每次只可以進行下面兩種操作之一:① 將輸入序列頭端的資料移至 s 棧頂(進 s 棧);

②  將 s 棧頂元素輸出並刪除(退 s 棧)。

當然,輸入序列非空時才可進行①操作,s 非空時才可進行②操作。

當①和②的操作都無法執行時,一定得到 n 個資料的乙個輸出序列。

由於①和②混搭的次序不同,導致相應的輸出序列也各不相同,

請你求出能夠得到的輸出序列中字典序最小的乙個序列。所謂字典序最小可以這樣理解:首元素盡量小,在首元素最小的序列中第二元素盡可能小、在前 2 資料字典序最小的序列中,第三項盡可能小…,直至 n 項全部排完。

【輸入輸出說明】

輸入檔案 stack.in 第一行僅有乙個正整數 n,表示輸入序列中資料的個數。

第二行就是輸入序列中依次排列的 n 個資料,相鄰兩資料間有乙個空格。

輸出檔案 stack.out 中僅有一行 n 個數,就是字典序最小的輸出序列,相鄰整數間用乙個空格隔開。

【輸入輸出樣例】

stack.in:

2 3 1 4

stack.out:

1 3 2 4

【樣例說明】

得到最小字典序的操作序列為:①①①②②②①②

【資料說明】

60%的資料 n<12;

80%的資料 n<1000;

100%的資料 n<100000,其他資料在 int 範圍。

首先我們發現題目是區賽的第二個題,按照往年的慣例,第二個題以貪心模擬為主

而因為要求按照字典序輸出,很明顯應該滿足前面的數盡可能小

於是我們得到了貪心思路:

(1)因為輸入序列是單向的,所以可以使用乙個idx表示當前處理到第幾位

(2)每次查詢從前往後最小的數,在這個數的位置壓棧

(3)首先彈出第乙個數,之後判斷每乙個棧頂的數是否小於後面最小的數

(4)若棧頂等於後面最小的數,因為輸入序列是單向的,所以應該盡可能先彈出前面的數

(5)為了節約時間,初始化book陣列,用book[i]表示第i個數至第n個數之間最小的數的最小編號(可以利用遞推實現)

上**:

#include#include

#include

#include

#include

#include

#define _ 0

#define olinr return

#define love_nmr 0

using

namespace

std;

int n,a[100050],book[100050

],idx;

intmain()

bool flag=false;//

判斷是否首位

while(1

)

return0;

}//處理到輸入序列最後一位,全部彈出

if(!flag)idx=1,flag=true

;

for(i=idx;i<=book[idx];i++)s.push(a[i]);//

壓棧 idx=i;//

更新idx

if(!s.empty())

while(!s.empty()&&s.top()<=a[book[idx]])

}olinr ~~love_nmr-(0^_^0

);}

比賽的時候就得了50分

後來發現把a[book[idx]]打成了book[idx] q_q

noip知識範圍

數論 快速冪,快速乘 費馬小定理 尤拉定理 拓展歐幾里得 篩素數 組合數取模 這個,背背 吧,反正比較好記 乘法逆元 矩陣 中國剩餘定理 也比較好記 容斥原理 01分數規劃 大步小步演算法 資料結構 簡單的就不說了 單調佇列,雙端佇列 有個容器 單調棧,堆 手打的,各種操作 樹狀陣列 線段樹 樹鏈剖...

NOIP 考前注意

0.比賽前一天晚上請準備好你的各種證件,事先查好去往考場的路線 1.比賽之前請先調整你的螢幕解析度到你喜歡的大小 2.比賽之前請把編譯器的字型調為你平時慣用的字型,尤其是注意這種字型中的逗號,點,1,l這種易混淆的字是不是區分明顯 3.在不影響視野的情況下,請將字型大小盡可能調大,方便查錯 4.請將...

NOIP 關押罪犯

描述 description s 城現有兩座監獄,一共關押著n 名罪犯,編號分別為1 n。他們之間的關係自然也極不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用 怨氣值 乙個正整數值 來表示某兩名罪犯之間的仇恨程度,怨氣值越大,則這兩名罪犯之間的積怨越多。如果兩名怨氣值為...