今天qwb要參加乙個數學考試,這套試卷一共有n道題,每道題qwb能獲得的分數為ai,qwb並不打算把這些題全做完,
他想選總共2k道題來做,並且期望他能獲得的分數盡可能的大,他準備選2個不連續的長度為k的區間,
即[l,l+1,l+2,....,l+k-1],[r,r+1,r+2,...,r+k-1](r >= l+k)。
第一行乙個整數t(t<=10),代表有t組資料接下來一行兩個整數n,k,(1<=n<=200,000),(1<=k,2k <= n)
接下來一行n個整數a1,a2,...,an,(-100,000<=ai<=100,000)
輸出乙個整數,qwb能獲得的最大分數
26 31 1 1 1 1 1
8 2-1 0 2 -1 -1 2 3 -1
67
找兩個區間之和的最大值,很明顯區間不能疊加,而且資料範圍告訴我們沒法直接列舉
ac:#include#include#include//#include#include#include#include#include#include#include#includeusing namespace std;
#define ll long long
#define da 0x3f3f3f3f
#define xiao -0x3f3f3f3f
#define clean(a,b) memset(a,b,sizeof(a))// 雷打不動的標頭檔案
ll a[200100],c[200100];
int cmp(int a,int b)
int main()
c[n+1]=-999999999999;
for(i=n;i>=2*k-1;--i)//從最後乙個開始,找所有k範圍的最大值
c[i]=c[i+1]>(a[i]-a[i-k])?c[i+1]:(a[i]-a[i-k]);//比較最大值,如果更大則重新整理,否則最大值不變
ll maxx=-999999999999;
for(i=k;i<=n-k;++i)//遍歷所有的最大值組合
maxx=maxx>(a[i]-a[i-k]+c[i+k])?maxx:(a[i]-a[i-k]+c[i+k]);//該值加上k個數之後的那些組合的最大值,找到最大值
cout<
最大連續區間和的演算法總結
最大連續區間和是乙個經典的問題。給定乙個長度為n的序列a 1 a 2 a n 1 a n 求乙個連續的子串行a i a i 1 a j 1 a j 使得a i a i 1 a j 1 a j 最大。最簡單最容易想到的就是根據定義來列舉。列舉上下界,維護乙個max值即可。其中列舉上下界的時間複雜度為o...
求連續子串行的最大值
問題描述 有一串數字 可正可負的int,放在陣列num裡 要求找到起始位置start和終止位置end,使得從start位置到end位置的所有數字之和最大,返回這個最大值max。演算法思想 使用動態規劃。設 f x 為以 a x 終止且包含 a x 的最大序列的和,有 f 1 a 1 f x 1 f ...
I Hate It(線段樹的區間最大值)
很多學校流行一種比較的習慣。老師們很喜歡詢問,從某某到某某當中,分數最高的是多少。這讓很多學生很反感。不管你喜不喜歡,現在需要你做的是,就是按照老師的要求,寫乙個程式,模擬老師的詢問。當然,老師有時候需要更新某位同學的成績。input 本題目包含多組測試,請處理到檔案結束。在每個測試的第一行,有兩個...