刷題之旅no3 奶牛排隊

2021-10-22 23:06:59 字數 1695 閱讀 5916

奶牛排隊問題:

給出陣列大小

給出陣列內容

求陣列中符合要求的最長子陣列(連續)

要求就是:前面最小,後面最大,中間奶牛不可以和兩端相等

思路,對陣列進行遍歷:

分開頭(長度為0)

記錄開頭陣列,記錄陣列長度,長度和下標加一

中間與前面相比

如果此時長度1

如果小於等於,歸零,說明不成佇列,比較記錄最大值0,並且以這個元素為開頭繼續遍歷

如果大於,長度加1,下標加1

此時長度大於1(看來結尾的判斷有點問題,所以一定要思考)

如果大於

說明此時可以成為乙個佇列,長度加一,並且要進行max判斷

如果等於(需要討論)

等於,但不知道是否合理,所以長度加一,不進行max判斷,直接不用管就好了。

如果小於前面的

不成佇列,長度變為1,重新開始

好吧,這下慘了,我連題都沒讀懂額。

我的思想出現了問題,題目中沒有要求奶牛的身高是遞增的,也就是說,只要求佇列兩端,if前者小,後者最大即可,對於中間值的順序並沒有要求哦。

更改**:

加入max,min,對佇列兩端進行標記

min標記陣列首位,length+1,i+1

判斷是否大於min

如果大於

}如果等於小於

又錯了,。。。

不過有進步,進步了40分,現在七十分

想一想又是**出了問題

邏輯出現嚴重問題,也就是說,在我設定最小值之後,如果此時佇列中進入了乙個特別大的數,那麼會導致之後數字不會出現閉合,也就是說還不如不加入這個數字呢/

每當更新一次最大值之後,我都要對這個最大值進行記錄,然後嘗試將其後面的乙個數字當作最小值,來進行處理。

實在不行,借鑑大佬思路,看到題目中的標籤

要用到乙個演算法,名字叫:單調棧

對於這道題所要求的就是對於這個序列,需要保證:

對於這個序列的最左端的值,其右邊第乙個小於等於它的值一定在最右端值的右邊

而對於這個序列最右端的值,其左邊第乙個大於等於它的值一定在最左端值得左邊

分別對這個陣列進行左右遍歷,分別找到每個元素對應的:

1.其右端,第乙個小於等於它的值的下標

2.其左端,第乙個大於等於它的值的下標。

取出兩個元素a,b(小標),且a#include

int stack[

100100]=

,cow[

100100]=

,leftr[

100100]=

,rightr[

100100]=

;int top=

0,head=

1,tail=

0,n,maxlen=0;

//注意stack用來記錄下標,而不是位置

void

scan()

}void

stc(

)else

else

//大於等於 }}

} top=0;

for(

int i=

1;i<=n;i++

)else

else

//小於等於 }}

}}void

lin(

)else

}else

break;}

}}}if

(tail==n)}}

intmain()

pat刷題之旅1002

一開始那道題,我的思路就是用乙個變數n來儲存所輸入的數,之後通過模10,除10運算來求得每一位上的數之和,最後將所求得的和進行模10,除10將每一位上的數放到陣列arr中,通過switch case語句對應到相應的漢字表示中。如下。include includeint main int s 0,i ...

hdoj刷題之旅 2003

輸入乙個百分制的成績t,將其轉換成對應的等級,具體轉換規則如下 90 100為a 80 89為b 70 79為c 60 69為d 0 59為e 輸入資料有多組,每組佔一行,由乙個整數組成。對於每組輸入資料,輸出一行。如果輸入資料不在0 100範圍內,請輸出一行 score is error edas...

hdoj刷題之旅 2025

對於輸入的每個字串,查詢其中的最大字母,在該字母後面插入字串 max 輸入資料報括多個測試例項,每個例項由一行長度不超過100的字串組成,字串僅由大小寫字母構成。對於每個測試例項輸出一行字串,輸出的結果是插入字串 max 後的結果,如果存在多個最大的字母,就在每乙個最大字母後面都插入 max abc...