題目傳送門
在一年前贏得了小鎮的最佳草坪比賽後,fj 變得很懶,再也沒有修剪過草坪。
現在,新一輪的最佳草坪比賽又開始了,fj 希望能夠再次奪冠。
然而,fj 的草坪非常髒亂,因此,fj 只能夠讓他的奶牛來完成這項工作。
fj 有 n 只排成一排的奶牛,編號為 1 到 n。
每只奶牛的效率是不同的,奶牛 i 的效率為 ei。
編號相鄰的奶牛們很熟悉,如果 fj 安排超過 k 只編號連續的奶牛,那麼這些奶牛就會罷工去開派對。
因此,現在 fj 需要你的幫助,找到最合理的安排方案並計算 fj 可以得到的最大效率。
注意,方案需滿足不能包含超過 k 只編號連續的奶牛。
輸入格式
第一行:空格隔開的兩個整數 n 和 k;
第二到 n+1 行:第 i+1 行有乙個整數 ei。
輸出格式
共一行,包含乙個數值,表示 fj 可以得到的最大的效率值。
資料範圍
1≤n≤105
0≤ei≤109
輸入樣例:
5 212輸出樣例:樣例解釋345
fj 有 5 只奶牛,效率分別為 1、2、3、4、5。
fj 希望選取的奶牛效率總和最大,但是他不能選取超過 2 只連續的奶牛。
因此可以選擇第三隻以外的其他奶牛,總的效率為 1 + 2 + 4 + 5 = 12。
題解:f[i]表示前 i 個人合法情況下的最高效率, s[i]為字首和
則對於f[i]:
1.不選第 i 個人, f[i] = f[i - 1]
2.選第 i 個人, 設在 i 前面選了 x 個人, 則f[i] = max(f[i - x - 1] + s[i] - s[i - x]) = max(f[i - x - 1] - s[i - x]) + s[i];
3.由於資料範圍很大, 所以我們可以用單調佇列來維護f[i - x - 1] - s[i - x]的最大值,
#include
using namespace std;
typedef
long
long ll;
const
int n =
1e5+10;
int n, m;
ll f[n]
;ll sum[n]
;int st[n]
;int
main()
int l =
0, r =0;
for(
int i =
1; i <= n; i++
) cout << f[n]
<< endl;
return0;
}
AcWing 1087 修剪草坪
link 雙倍經驗 三倍經驗 陣列沒開夠,爆零兩行淚 longlong開成int,爆零兩行淚 多組忘清空,爆零兩行淚 dp 沒初值,爆零兩行淚 深搜沒邊界,爆零兩行淚 廣搜忘出隊,爆零兩行淚 輸入沒加 爆零兩行淚 模數沒看見,爆零兩行淚 1 不輸出,爆零兩行淚 越界不特判,爆零兩行淚 線段樹開一倍,...
2202 修剪草坪
在一年前贏得了小鎮的最佳草坪比賽後,約翰變得懶惰了,再也沒有修剪過草坪。現在,新一輪的比賽又開始了,約翰希望能夠再次奪冠。然而,約翰家的草坪非常髒亂,因此,約翰需要讓他的奶牛來完成這項工作。約翰家有n頭奶牛,排成一直線,編號為1到n。每只奶牛的能力是不同的,第i頭奶牛的能力為ei。靠在一起的奶牛很熟...
小學期 修剪草坪
有乙個n m的草坪 1 n,m 100 草坪中的草原來的高度都是100。現在使用割草機修剪草坪,來得到各種各樣的圖案。割草機只 能橫著或者豎著割草。每次割草都會先設定乙個高度,割完之後會把比設定高度高的草都割成設定的高度。比如草原來是5 2 8,設定高度為4,那麼割完之後就變成了4 2 4。現在給出...