CSP202109-2 非零段划分 題解


一道比較考思路的題目,這里就不搬題目了既然大家都來看,還是搬題目吧(\(\LaTeX\)好多QwQ)。

題目

題目描述

\(A_1,A_2,...,A_n\) 是一個由 \(n\) 個自然數(非負整數)組成的數組。我們稱其中 \(A_i,...,A_j\) 是一個非零段,當且僅當以下條件同時滿足:

  • \(1\leq i\leq j\leq n\)

  • 對於任意的整數 \(k\),若 \(i\leq k\leq j\),則 \(A_k>0\)

  • \(i=1\)\(A_{i-1}=0\)

  • \(j=n\)\(A_{j+1}=0\)
    下面展示了幾個簡單的例子:

  • \(A=[3,1,2,0,0,2,0,4,5,0,2]\) 中的 \(4\) 個非零段依次為 \([3,1,2]\)\([2]\)\([4,5]\)\([2]\)

  • \(A=[2,3,1,4,5]\) 僅有 \(1\) 個非零段;

  • \(A=[0,0,0]\) 則不含非零段(即非零段個數為 \(0\))。

現在我們可以對數組 \(A\) 進行如下操作:任選一個正整數 \(p\),然后將 \(A\) 中所有小於 \(p\) 的數都變為 \(0\)。試選取一個合適的 \(p\),使得數組 \(A\) 中的非零段個數達到最大。若輸入的 \(A\) 所含非零段數已達最大值,可取 \(p=1\),即不對 \(A\) 做任何修改。

輸入格式

從標准輸入讀入數據。

輸入的第一行包含一個正整數 \(n\)

輸入的第二行包含 \(n\) 個用空格分隔的自然數 \(A_1,A_2,...,A_n\)

輸出格式

輸出到標准輸出。

僅輸出一個整數,表示對數組 \(A\) 進行操作后,其非零段個數能達到的最大值。

樣例1輸入

11
3 1 2 0 0 2 0 4 5 0 2

樣例1輸出

5

樣例1解釋

\(p=2\) 時,\(A=[3,0,2,0,0,2,0,4,5,0,2]\)\(5\) 個非零段依次為 \([3]\)\([2]\)\([2]\)\([4,5]\)\([2]\);此時非零段個數達到最大。

樣例2輸入

14
5 1 20 10 10 10 10 15 10 20 1 5 10 15

樣例2輸出

4

樣例2解釋

\(p=12\) 時,\(A=[0,0,20,0,0,0,0,15,0,20,0,0,0,15]\)\(4\) 個非零段依次為 \([20]\)\([15]\)\([20]\)\([15]\);此時非零段個數達到最大。

樣例3輸入

3
1 0 0

樣例3輸出

1

樣例3解釋
\(p=1\) 時,\(A=[1,0,0]\),此時僅有 \(1\) 個非零段 ,非零段個數達到最大。

樣例4輸入

3
0 0 0

樣例4輸出

0

樣例4解釋

無論 \(p\) 取何值,\(A\) 都不含有非零段,故非零段個數至多為 \(0\)

子任務

\(70\%\) 的測試數據滿足 \(n\leq 1000\)

全部的測試數據滿足 \(n\leq 5\times 10^5\),且數組 \(A\) 中的每一個數均不超過 \(10^4\)

思路

其實這是一個結論題。

1.結論

結論就是:

  • 如果一個數比旁邊兩個數都大,那p就+1;
  • 如果一個大一個小就不變;
  • 如果比兩個都小就-1。
    整合一下:

\[p=\sum\limits_{i=1}^{n} \begin{cases} 1& a_i>a_{i\pm 1}\\ 0& a_{i\pm 1}<a_i<a_{i\mp 1}\\ -1 & a_i<a_{i\pm 1} \end{cases} \]

2.過程

我們首先把一個數出現的所有位置記錄下來,這個我們可以用vector。就像這樣:
image
之后,我們從大到小來看每一個數所在的每一個位置:
image
這里的auto &t:v[i]是一個比較新的語法,就是遍歷每一個的意思,用於C++14。
其實這里的1-vs[t-1]-vs[t+1]是一個省略的寫法。這里vs是bool數組,表示他有沒有訪問過。
如果\(t-1\)這個位置訪問過,說明\(t-1\)位置數比他大,\(t+1\)也是同理。
如果正好一個比他大,就是\(1-1-0=0\),兩個都大就是\(1-1-1=-1\),兩個都比他小就是\(1-0-0=1\)
注意,這里的p指的是非零段個數,也就是說我們不一定求得出真正的題目中的p,不過可以暴力。
最后,就是把這些段數取最大值。

3.整體代碼

image

總結

寫得比較短,因為是從一段QQ聊天記錄里面粘的,就不補充了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM