這道題雖然是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,...