天天看點

算法筆試模拟題精解之“Codancer的求和”

【線上程式設計産品介紹】

阿裡雲開發者社群線上程式設計:

免費刷題大神器,助你拿到好offer

周賽月賽不停歇,做題還能領獎品

大賽筆試全真題,常做常新有驚喜

點選連結開始産品體驗:

https://developer.aliyun.com/coding 本文為大家介紹的是“124.Codancer的求和”的解法探究。先來看一下題目内容:

題目詳情

等級:困難

知識點:線段樹

檢視題目:Codancer的求和

現在Codancer有兩個長度均為n的數組a數組和b數組,其中對于a中的每個元素a[i]都有(-10^6<=a[i]<=10^6),對于b中的每個元素b[i]都有(0<=b[i]<=n),對于每個i(1<=i<=n),我們定義區間[L,R]是合法的隻有[L,R]滿足下面的條件:

1、1<=L<=R<=n

2、0<=i-L,R-i<=b[i]

現在對于每個i,Codancer想找到一組合法區間使得(a[L]+a[L+1]+...a[R])最大,并将這個最大值記為s[i]。

現在請計算(s[1]+s[2]+s[3]+...+s[n])。

輸入包含一個n(1<=n<=10^5)和兩個數組b,a。(b在前面,a在後面)

輸出s數組的和。

示例1

輸入:

5

[1,2,3,4,4]

[-5,1,2,3,-4]

輸出:

16

注意:

s[1]=-4

s[2]=6

s[3]=6

s[4]=6

s[5]=2

是以最終答案為16

解題思路

S[1]=a[1]+a[2]=-4,此時S[1]最大

S[2]=a[2]+a[3]+a[4]=6,此時S[2]最大

同理可得

S[3]=a[2]+a[3]+a[4]=6, S[4]=a[2]+a[3]+a[4], S[5]=a[2]+a[3]+a[4]+a[5]=2

是以答案為S[1]+S[2]+S[3]+S[4]+S[5]=16。

算法筆試模拟題精解之“Codancer的求和”

考慮對a數組做字首和數組pre,即pre[i]是(a[1]+a[2]+...+a[i])的值,同時對a做字尾和數組sa,即sa[i]是(a[i]+a[i+1]+...a[n])的值,那麼s[i]可以由兩部分組成,左邊的a[L]+...+a[i],右邊的a[i]+...+a[R]。

左邊其實就是找到一個L,使得a[L]+...+a[i]盡可能的大,右邊同理,是以左邊其實就是max(sa[max(1,i-k)]...sa[i])-sa[i+1]。

右邊是max(pre[i]...pre[min(i+k,n)])。

對字首和和字尾和分别建立線段樹,O(log(n))求解s[i]即可,答案會爆int,是以需要用long long存儲。

看完之後是不是有了答題思路了呢,快來練練手吧:

124.Codancer的求和

線上程式設計周賽、月賽火熱進行中,更有限時答題活動,定制衛衣、雙肩背包、機械鍵盤等多重好禮等你來拿~每天都有好禮相送~點選了解周賽詳情:

線上程式設計3月份比賽正式開啟!機械鍵盤等你拿!
算法筆試模拟題精解之“Codancer的求和”

繼續閱讀