n個整數組成的序列a1wqs二分/帶權二分裸題,顯然函式為凸函式,問題只需要解決沒有限制的情況下如何求最大值。'>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。
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,中間用空格分隔。...