來自
先是read()函式,用於快速讀入,比cin快,比printf快
int
read()
ch=getchar()
;}while
(ch>=
'0'&&ch<=
'9')
return x*f;
}
呼叫函式的時候定義乙個新變數
比如輸入乙個t,表示測試次數
int t;
t=read()
;
接下來是看題幹,兩個不連續的區間
區間長度為k
int
main()
for(
int i=n-k+
1;i>k;i--
) cout<}return0;
}
用乙個sum[i]表示前i個數的和,這樣區間[l,r]可以用sum[r-1]-sum[l-1]表示。
這種開陣列的做法避免了遍歷ai求和的過程(優化)。
然後自右向左,比較[i,k]的區間中的成績和,取最大的存入ans[i]中,定義乙個res為最後結果,取i左邊最大的區間和右邊最大的區間和。
右邊最大的區間為ans[i] (sum[i+k-1] - sum[i-1]) ,左面最大的為sum[i-1] - sum[i-k-1].
再解釋一下,就是ans[i]的部分在通過遍歷尋找右面區間的最大值,然後如果有更大的就頂替掉原來的ans[i],不然就ans[i]=ans[i+1]繼續保持最大結果。i左邊的區間同理。最後用res存和最大的情況,輸出。
數學考試(差分)
今天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 input ...
數學考試(字首和)
今天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 第一行乙個整...
數學考試 (字首和 思維)
題目 找出數列中不連續的最大的k區間 和第二大的k區間 這樣的貪心思想是錯誤的。例如7 3 5 6 6 8 10 12 7 不連續的第一大3區間 和第二大分別為 8 10 12 和 5 6 6 這樣計算答案為47.實際上應該選 6 6 8 和 10 12 7 答案為49 以i為分界線,i的左邊包括i...