題目:在蒜廠年會上有乙個**,在乙個環形的桌子上,有 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即可.
#includeusingnamespace
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個開始,到第...