一道比較考思路的題目,這里就不搬題目了既然大家都來看,還是搬題目吧(\(\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。
整合一下:
2.過程
我們首先把一個數出現的所有位置記錄下來,這個我們可以用vector。就像這樣:
之后,我們從大到小來看每一個數所在的每一個位置:
這里的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.整體代碼
總結
寫得比較短,因為是從一段QQ聊天記錄里面粘的,就不補充了。