網教 7 蜜汁序列

2021-07-22 08:53:55 字數 1512 閱讀 1241

題目描述

傳說中有一種蜜汁序列特別甜,所以愛吃甜的強渣學長特別喜歡這種序列。。。

蜜汁序列的定義如下:對於乙個長度為n的序列a1,...,an,如果這個序列的n個字首和全部非負,即若a1>=0,a1+a2>=0,...,a1+a2+...+an>=0,則稱a序列是蜜汁序列。。。

顯然一些蜜汁序列可以分成更多的蜜汁序列,例如1 2這個蜜汁序列可以分成1和2兩個蜜汁序列,現在有乙個長度為n的蜜汁序列,要求你把他分成若干連續的段,使得每段都是乙個蜜汁序列,問最多可以分成多少段?

輸入

多組用例,每組用例首先輸入乙個整數n表示給出的蜜汁序列長度,之後輸入n個整數a1,a2,...,an表示該序列的n個元素,以檔案尾結束輸入

輸出

對於每組用例,輸出乙個整數佔一行,表示該序列最多可以分成多少個蜜汁序列

資料範圍

用例不超過10組,1<=n<=10^6,-10^4<=ai<=10^4(i=1,2,...,n)

樣例輸入1

131 2 3

樣例輸出1

3題解:

題目不難,讀懂題目就能有個思路。問的是題目給的蜜汁序列中最多能劃分成幾個蜜汁序列。

因為資料範圍非常大,所以如果每個數都是從a1開始一直往後數的話肯定會超時。但是注意到題目要求的是字首和大於0,所以對於乙個負數來說,要找到它所在的那個蜜汁序列,就必須要往前找,因為如果往後找的話肯定就已經不滿足a1>=0了。如果有好幾個負數連續,就需要從最後的那個負數開始往前倒。

一開始我寫的是正序,後來就發現了問題:不知道遇到了a[n+1]>=0時是否要停止。就比如1 2 -1 -2 3 - 1 -2與2 2 -1 -2 2 -1 -2遇到第乙個-1的時候不知道該不該停。所以就要從最後乙個數往前數。

然後如何判斷是否找到了蜜汁序列呢?方法是看這k個數總和是否大於0.如果遇到了正數,那麼肯定它獨自成乙個序列。如果遇到了負數,就要往前找,直到這連續的k個數之和大於0為止。原因是a2--ak一定是負的,否則就不需要a1了;a3--ak也一定是負的……然後既然a1與a2--ak之和為正,且a3--ak為負,所以a1+a2也為正。以此類推……只要滿足這k個數的和是正的,就能滿足這是蜜汁序列。

有了如上思路,就能有乙個線性遍歷的演算法了。但是還有一點沒注意到,也就是這一點我wa了不止五發……

n是1e6,ai是1e4,稍有不慎就爆int。。。

所以必須要用long long啊orz

這序列果然很迷啊……

**如下:

//因為乙個long long 我wa了10法/微笑

#include#includeint num[1000005];

int index = 0;

int main()

}index++;

} printf("%d\n", index);

} return 0;

}

網教30 過橋

題目描述 小a有x隻羊和y只狼,現在,他需要通過一座橋。由於橋面很窄,橋每次只允許通過小a和n只動物。小a很愛動物,所以他每次通過橋時都必須有乙隻動物陪著他,否則他會很寂寞。並且不論是在牆上或者是在橋的兩頭,一旦羊的數量少於狼的數量,狼就會開始吃羊。為了不讓羊被吃掉,又要讓所有動物和小a自己都通過橋...

網教17 有吃的!

婦添小有乙個很厲害的技能 發現吃的!如果有好吃的東西,不論多遠,只要一聞就能知道在 這天他剛剛在程設rejudge完,忽然鼻子一抽 有吃的!他決定馬上趕去吃這麼好吃的東西。語文男為了考驗婦添小的品味,在路中間放了很多饅頭,看他會不會餓的先吃饅頭。婦添小當然不會讓這種雕蟲小計得逞!為了保持自己的品味,...

網教20 猜 丁 殼!

石頭 剪刀 布 也叫作 猜丁殼 是猜拳 的一種。遊戲規則中,石頭克剪刀,剪刀克布,布克石頭。紅哥哥聽聞程設的同學們都是擅長玩猜丁殼的高手,於是他決定舉辦一場主題為 猜丁殼 的遊戲party。想要參加party,你必須cospaly為石頭 剪刀 布中的一種。紅哥哥為了增加遊戲難度,他限制了party中...