2018 藍橋杯省賽 B 組模擬賽(五)合併數字

2021-09-13 12:38:03 字數 1083 閱讀 5593

題目鏈結

蒜頭君得到了 nn 個數,他想對這些數進行下面這樣的操作,選出最左邊的相鄰的差的絕對值為 11的兩個數,只保留較小的數,刪去較大的數,直到沒有兩個相鄰的差的絕對值為 11 的數,問最多可以進行多少次這樣的操作?

輸入第一行為乙個整數 n(1 \leq n \leq 10^5)n(1≤n≤105),表示數字的總數

第二行為 nn 個整數 x_1,x_2,...,x_n(0 \leq x_i \leq 10^9)x1​,x2​,...,xn​(0≤xi​≤109),表示這些數。

輸出一行,為乙個整數,表示蒜頭君最多可以進行多少次這樣的操作。

樣例輸入複製

4

1 2 0 1

樣例輸出複製

3
讀錯了好幾次題...

維護乙個棧和佇列,先把第乙個元素放到棧裡,然後每次都判斷棧首和隊首的元素差值是否為1.

這裡考慮到幾個情況:

1.abs(隊首-棧首)不等於1,那麼隊首入棧。

2.如果隊首-棧首=1,那麼隊首直接出佇列即可。

3.如果棧首-隊首=1,將棧首出棧,隊首入棧,這時候需要判斷,棧首與隊首的差值是否為1,回到了情況2.3,迴圈。否則break

#includeusing namespace std;

typedef long long int ll;

const int maxn(1e5);

const int inf(0x3f3f3f3f);

stacks;

queueq;

int main()

int ans=0;

s.push(q.front());

q.pop();

while(!q.empty())

else

s.push(q.front());

}else

s.push(q.front());

q.pop();

ans++;

}else if(q.front()-s.top()==1)

else

}cout<53 5 6 4 1

*/

2018 藍橋杯省賽 B 組模擬賽(一)

給你乙個序列,請你在其中求出一段最長嚴格上公升的部分,它不一定要連續。include includeusing namespace std int f 10000 b 10000 int lis int n res max res,f i return res 1 int main printf d...

2018 藍橋杯省賽 B 組模擬賽(五)整數劃分

蒜頭君特別喜歡數學。今天,蒜頭君突發奇想 如果想要把乙個正整數 n n 分解成不多於 k k 個正整數相加的形式,那麼一共有多少種分解的方式呢?蒜頭君覺得這個問題實在是太難了,於是他想讓你幫幫忙。共一行,包含兩個整數 n 1 leq n leq 300 n 1 n 300 和 k 1 leq k l...

2018 藍橋杯省賽 B 組模擬賽(五)矩陣求和

給你乙個從 n times nn n 的矩陣,裡面填充 1 1 到 n times nn n 例如當 n n 等於 3 3 的時候,填充的矩陣如下。1 2 3 4 5 6 7 8 9 現在我們把矩陣中的每條邊的中點連起來,這樣形成了乙個新的矩形,請你計算一下這個新的矩形的覆蓋的數字的和。比如,n 3...