problem description
對於包含n(1<=n<=100000)個整數的序列,對於序列中的每一元素,在序列中查詢其位置之後第乙個大於它的
值,如果找到,輸出所找到的值,否則,輸出-1。
input
輸入有多組,第一行輸入t(1<=t<=10),表示輸入的組數;
以後是 t 組輸入:每組先輸入n,表示本組序列的元素個數,之後依次輸入本組的n個元素。
output
輸出有多組,每組之間輸出乙個空行(最後一組之後沒有);
每組輸出按照本序列元素的順序,依次逐行輸出當前元素及其查詢結果,兩者之間以–>間隔。
sample input
24 12 20 15 18
5 20 15 25 30 6
sample output
12–>20
20–>-1
15–>18
18–>-1
20–>25
15–>25
25–>30
30–>-1
6–>-1
思路:就是按照給定的資料逆序進行入棧出棧操作。
來儲存下一最大值。
意思就是從最後乙個資料開始入棧,在入棧之前先找下一最大值。如果這時棧是空的,證明沒有下一最大值。
如果不空,就出棧,直到找到比當前資料大的或者棧為空為止。
這裡注意的是,題目是找「下乙個」最大值(就是距離自己最近的比自己大的數),所以說,比當前數值小的資料出
棧對以後的操作沒有任何的影響。
#include #include #include #include #include #include using namespace std;
int main()
//出棧,直到為空棧或者找到比自己大的數停止。
else
//沒有找到那個它,就是-1了,入棧。
if(st1.empty())
else}}
//把第二個棧按照出棧的順序輸出就行了。
for(int i=0; i%d\n",a[i],st2.top());
st2.pop();
}//最後注意一下,最後一組沒有空行
printf(t==0?"":"\n");}}
return 0;
}
第二種方法:這種方法就是犧牲空間換時間。使用c寫的。
#include
#include
int a[
100005];
//輸入的資料
int b[
100005];
//棧,儲存資料
int c[
100005];
//棧,儲存索引
int d[
100005];
//最終輸出的資料
intmain()
else
if(j>-1
&&b[j]
) b[
++j]
= a[i]
; c[j]
= i;}}
for(i=
0;i)printf
(i==n-1?
"%d-->%d\n\n"
:"%d-->%d\n"
,a[i]
,d[i]);
}return0;
}
精簡版:在第二種方式的基礎上簡化
#include
#include
int a[
100005
],b[
100005
],c[
100005
],d[
100005];
intmain()
for(i=
0; i)printf
(i==n-1?
"%d-->%d\n\n"
:"%d-->%d\n"
,a[i]
,d[i]);
}return0;
}
資料結構實驗之棧與佇列六 下一較大值(二)
time limit 150ms memory limit 8000kb submit statistic problem description 對於包含n 1 n 100000 個整數的序列,對於序列中的每一元素,在序列中查詢其位置之後第乙個大於它的值,如果找到,輸出所找到的值,否則,輸出 1。...
資料結構實驗之棧與佇列六 下一較大值(二)
資料結構實驗之棧與佇列六 下一較大值 二 time limit 150 ms memory limit 8000 kib problem description 對於包含n 1 n 100000 個整數的序列,對於序列中的每一元素,在序列中查詢其位置之後第乙個大於它的值,如果找到,輸出所找到的值,否...
資料結構實驗之棧與佇列六 下一較大值(二)
problem description 對於包含n 1 n 100000 個整數的序列,對於序列中的每一元素,在序列中查詢其位置之後第乙個大於它的值,如果找到,輸出所找到的值,否則,輸出 1。input 輸入有多組,第一行輸入t 1 t 10 表示輸入的組數 以後是 t 組輸入 每組先輸入n,表示本...