長度不超過n的連續最大和

2022-06-02 05:00:12 字數 1359 閱讀 8557

題目:在蒜廠年會上有乙個**,在乙個環形的桌子上,有 nn 個紙團,每個紙團上寫乙個數字,表示你可以獲得多少蒜幣。但是這個遊戲比較坑,裡面竟然有負數,表示你要支付多少蒜幣。因為這些數字都是可見的,所以大家都是不會出現的賠的情況。

遊戲規則:每人只能抓一次,只能抓取一段連續的紙團,所有紙團上的數字和就是你可以獲得的蒜幣。

蒜頭君作為蒜廠的一員在想,我怎麼可以獲得最多的蒜幣呢?最多能獲取多少蒜幣呢?

因為年會是發獎,那麼一定有大於 00 的紙團。

第一行輸入乙個整數 nn,表示有 nn 個紙團。

第二行輸入輸入 nn 個整數 a_iai​,表示每個紙團上面寫的數字(這些紙團的輸入順序就是環形桌上紙團的擺放順序)。

輸出乙個整數,表示蒜頭君最多能獲取多少蒜幣。

對於 30\%30% 的資料:1 \le n \le 10^2,-10^3 \le a_i \le 10^31≤n≤102,−103≤ai​≤103。

對於 60\%60% 的資料:1 \le n \le 5 \times 10^3,-10^6 \le a_i \le 10^61≤n≤5×103,−106≤ai​≤106。

對於 100\%100% 的資料:1 \le n \le 10^5,-10^9 \le a_i \le 10^91≤n≤105,−109≤ai​≤109。

樣例輸入

3

1 -2 1

樣例輸出

2題目**

2019 藍橋杯省賽 b 組模擬賽(一)

分析: 求迴圈的連續最大和.

迴圈好解決:   把陣列首尾連成2n長的.

然後就是求長度不超過n的最大連續和.

一般求連續和 直接用字首和,然後逐步做差即可.

但是這兒有個限制,要求長度不超過n. 所以我們可以用優先佇列:

維護乙個結構體 

struct node ;

根據index判斷一下長度是否超過n即可.

#includeusing

namespace

std;

typedef

long

long

ll;const

int maxn = 1e5+50

;ll arr[maxn * 2

];struct

node

node () {}

node (ll vv,

intii) : val(vv), index(ii) {}

};int

main()

else

}if (tans > res) res =tans;

pq.push();

}cout

<< res

}

N 組連續子串最大和

陣列 a 中有 m 個數 將 m 個數分成 n 組 並且每組中的資料順序和原陣列中的順序保持一致,求 n 組中的資料之和最大為多少?向 dp 陣列中賦初始值 如果 m n 則 dp i i dp i 1 i 1 a i 若n為1時 即為求連續子串最大和問題 假設dp 1 i 2 i m 代表 與第 ...

長度不超過m的最大連續子串行(dp 單調佇列)

給你n個數,然後讓你求最大連續子串行的和,限制條件是連續子串行的長度不超過m。n,m 100000 就是讓你找到乙個長度不超過m的區間,區間和最大。普通的dp轉移方程就是 dp i sum i min sum j i m j i 但是這樣的複雜度最壞會達到n 2,所以得優化,就用到了單調佇列。針對這...

連續子陣列的最大和

hz偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了 在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如 連續子向量的最大和為8 從第0個開始,到第...