51NOD 1053 最大M子段和 V2 題解

2022-09-14 17:57:19 字數 1358 閱讀 4795

n個整數組成的序列a1

'>1

,a2'>2

,a3'>3

,…,an

'>

n,將這n個數劃分為互不相交的m個子段,並且這m個子段的和是最大的。如果m >= n個數中正數的個數,那麼輸出所有正數的和。

例如:-2 11 -4 13 -5 6 -2,分為2段,11 -4 13一段,6一段,和為26。

wqs二分/帶權二分裸題,顯然函式為凸函式,問題只需要解決沒有限制的情況下如何求最大值。

f[i]為到i的最大值,則不取i就是f[i]=f[i-1],取i為f[i]=max-分一段代價。

顯然max可以用dp求。

細節還是蠻多的,畢竟你還得記錄求出最優值時分段個數,我的做法是限制在可能的情況下取更少的分段數,這樣的情況下如果還》m就肯定不符合條件。

#include#include

#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long

ll;typedef

long

double

dl;const

int n=50005

;inline

intread()

while(isdigit(ch))x=(x<<3)+(x<<1)+(ch^48),ch=getchar();

return w?-x:x;

}int

n,m,pcnt,g[n],maxfi[n];

ll s[n],f[n],maxf[n],maxans;

bool

pan(ll c)

else

if(maxf[i-1]s[i])

else}}

return g[n]<=m;

}ll solve(ll l,ll r)

}return l*m+b;

}int

main()

s[i]=s[i-1]+a;

}if(pcnt<=m) printf("

%lld\n

",maxans);

else printf("

%lld\n

",solve(0

,1e9));

return0;

}

+++++++++++++++++++++++++++++++++++++++++++

++++++++++++++++++++++++++++++++++++++++++++

51Nod 1053 最大M子段和 V2

acm模版 這個題需要用到貪心搞。首先涉及到一點優化是,連續的正數或者連續的負數,到最後肯定是可以合併在一起的,所以我們首先將序列中的相鄰正數或者相鄰負數全部合併,將序列壓縮,也許這個也談不上什麼優化,因為這個步驟對於整個貪心過程是必須的,在這個過程中,累計下來所有正數的和。此時,我們可以發現,新的...

51Nod 1052 最大M子段和

n個整數組成的序列a 1 a 2 a 3 a n 將這n個數劃分為互不相交的m個子段,並且這m個子段的和是最大的。如果m n個數中正數的個數,那麼輸出所有正數的和。例如 2 11 4 13 5 6 2,分為2段,11 4 13一段,6一段,和為26。刷刷水有益身心健康。不過我還是沒有一眼看出來。考慮...

51Nod1052 最大M子段和

n個整數組成的序列a 1 a 2 a 3 a n 將這n個數劃分為互不相交的m個子段,並且這m個子段的和是最大的。如果m n個數中正數的個數,那麼輸出所有正數的和。例如 2 11 4 13 5 6 2,分為2段,11 4 13一段,6一段,和為26。input 第1行 2個數n和m,中間用空格分隔。...