2017 3 3 雙棧排序 失敗總結

2021-07-27 18:34:13 字數 2350 閱讀 4226

這道題雖然是noip的題,但還是很能反映你思維水平的、 

說出來二分圖、黑白染色對於乙個oier來說肯定不陌生,有的人很快就能說出做法,寫出程式。

但是一出成題怎麼就不會了呢?

其實主要失誤在於 我是站在選a、b的角度思考問題的,但實際上,如果思路足夠清晰,還是能回到互斥的角度的

因為如果站在選a選b的角度上,能影響當前決策的實際上有3個不同的因素,1是出現順序,這好辦,掃過去就行。2是當前棧中元素的影響(這實際上是有後效性的,因為後面的數也會對當前決策造成影響:後面小數卡大數,導致空間被浪費,同時貪心是錯的:不信用7251463 試試、),3是當前數消不消除的影響。。(這比較坑,但如果從第2點已經看出後效性的話已經證實至少不是1個dp解決問題的題了)

這時候應該敏銳地發現,這種後效性是由空間消耗造成的,因為我們的貪心實際上維護的是乙個盡量裝a的序列,如果是跳著從大到小的序列,那對a的空間利用極低。

(ps:最討厭分析中的「不妨」,這倆字沒有任何意義,,解題的每一步都應該在題目中有根據的,用「不妨」蒙混過關對自己的思維並沒有太大的幫助)

當然,對於能處理的情況,我們首選a列,那麼我們應該還是用dp來維護,但並不完成劃分a、b工作,只是把能放在乙個棧裡的區間求出來,

然後由於非a即b,就需要利用黑白染色的互斥原理,進行遍歷。

總結:這題分析不出來,主要是思路受盡量選a的條件制約,抓住貪心放不開,認為前幾個都應該放a裡,且忽略了可行性這一重要因素,可行性是受盡量選a影響的。

應建立在可行性上盡量選a,而不是在盡量選a中實現可行性。

補一下,個人感覺第一步的dp也挺難的、

可以從小的資料入手:

1 2 3     :肯定可以單棧;                               1 3 2   :肯定可以單棧                          2 1 3    肯定可以單棧                  2 3 1:肯定不可以單棧(需要分開,且一定是2和3分開)

3 1 2   :肯定可以單棧                                3 2 1     肯定可以單棧

這樣就考慮了退出的情況,強行裝,為什麼不會出現不可行的情況?因為不可裝只和彈出、裝入有關,現在dp考慮了出棧,如果在加上彈出的情況,a裝不下了,那就是無論如何也裝不下了,只能另尋棧。

#include#includeusing namespace std;

int n,woc,a[99999],i,j,l,stacka[99998],stackb[99999],topa,topb,tu[1999][1999],sta[1999],ru[1999];

bool keyi,zou[1999];

void dfs(int now)

if(sta[now]==1&&sta[i]==-1)sta[i]=2;

if(sta[now]==2&&sta[i]==-1)sta[i]=1;

zou[i]=1;

dfs(i);

} }}

int main()

} for(i=1;i<=n;i++)if(sta[i]==-1)keyi=0;

if(!keyi)

stacka[0]=99999;

stackb[0]=99999;

woc=1;

for(i=1;i<=n;i++)

{ if(sta[i]==1)

{ while(stacka[topa]

***********************************====2017.8.21****************************************==

我們應該學會簡化一些問題,來為更複雜的問題開啟思路

如發現直接做兩個的很難搞,所以我們就先考慮乙個的

乙個的似乎也不好搞,於是我們可以嘗試操作一些數來找操作上的規律

我們注意到,,我們首先知道,它只與前面的數有關,其次知道幾組不能單棧的數列

然後我們判斷乙個數已經不能被排了,看的是棧頂的數的相對大小,而不是乙個值

所以我們可以推廣到所有數,所以也就會得到   數的大小關係   的訊號

所以我們就可以通過大小關係,遞推,得到dp

然後到雙棧的情況,我們可以先用乙個棧裝,然後再用另乙個棧,因為空棧顯然比放了幾個數的棧限制更小

雙棧的時候就可以考慮經典的分配問題,通過互斥進行分配,判定可行性

要學會小->大  數值->關係的推廣角度

1002 雙棧排序

description tom最近在研究乙個有趣的排序問題。如圖所示,通過2個棧s1和s2,tom希望借助以下4種操作實現將輸入序列公升序排序。操作a 如果輸入序列不為空,將第乙個元素壓入棧s1 操作b 如果棧s1不為空,將s1棧頂元素彈出至輸出序列 操作c 如果輸入序列不為空,將第乙個元素壓入棧s...

雙棧排序練習

題目 請編寫乙個程式,按公升序對棧進行排序 即最大元素位於棧頂 要求最多只能使用乙個額外的棧存放臨時資料,但不得將元素複製到別的資料結構中。給定乙個int numbers c 中為vector 其中第乙個元素為棧頂,請返回排序後的棧。請注意這是乙個棧,意味著排序過程中你只能訪問到第乙個元素。解題思路...

nowcoder 雙棧排序

請編寫乙個程式,按公升序對棧進行排序 即最大元素位於棧頂 要求最多只能使用乙個額外的棧存放臨時資料,但不得將元素複製到別的資料結構中。給定乙個int numbers c 中為vector 其中第乙個元素為棧頂,請返回排序後的棧。請注意這是乙個棧,意味著排序過程中你只能訪問到第乙個元素。測試樣例 1,...