奶牛排隊問題:
給出陣列大小
給出陣列內容
求陣列中符合要求的最長子陣列(連續)
要求就是:前面最小,後面最大,中間奶牛不可以和兩端相等
思路,對陣列進行遍歷:
分開頭(長度為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...