time limit: 1 second
memory limit: 128 mb
【問題描述】
對於給定的乙個長度為n的正整數數列a[i],現要將其分成連續的若干段,並且每段和不超過m(可以等於m),問最少能將其分成多少段使得滿足要求。
【輸入格式】
輸入檔案divide_a.in的第1行包含兩個正整數n,m,表示了數列a[i]的長度與每段和的最大值,第2行包含n個空格隔開的非負整數a[i],如題目所述。
【輸出格式】
輸出檔案divide_a.out僅包含乙個正整數,輸出最少劃分的段數。
【資料規模】
對於20%的資料,有n≤10; 對於40%的資料,有n≤1000; 對於100%的資料,有n≤100000,m≤109,m大於所有數的最小值,a[i]之和不超過109。
sample input1
5 6
4 2 4 5 1
sample output1
【樣例說明】
將數列如下劃分:
[4][2 4][5 1]
第一段和為4,第2段和為6,第3段和為6均滿足和不超過m=6,並可以證明3是最少劃分的段數。
【題目鏈結】:
【題解】
每一段盡量多地放元素就好->能放就放滿(因為是連續的,所以也沒有說像揹包問題那樣有後效性);
注意開ll吧。
【完整**】
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define ll long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
typedef pair pii;
typedef pairpll;
void rel(ll &r)
void rei(int &r)
const
int maxn = 1e5+100;
const
int dx[5] = ;
const
int dy[5] = ;
const
double pi = acos(-1.0);
int n;
ll m;
ll a[maxn];
int main()
else
temp+=a[i];
cout
<< now0;}
數列分段2
目描述 對於給定的乙個長度為n的正整數數列a i 現要將其分成m m n 段,並要求每段連續,且每段和的最大值最小。關於最大值最小 例如一數列4 2 4 5 1要分成3段 將其如下分段 4 2 4 5 1 第一段和為6,第2段和為9,第3段和為1,和最大值為9。將其如下分段 4 2 4 5 1 第一...
數列分段 Section II
對於給定的乙個長度為n的正整數數列 a i 現要將其分成 m m n 段,並要求每段連續,且每段和的最大值最小。關於最大值最小 例如一數列 4 2 4 5 1 要分成 3 段 將其如下分段 42 45 1 第一段和為 6 第 2 段和為 9 第 3 段和為 1 和最大值為 9 將其如下分段 4 24...
數列分段 Section II
點我點我點我點我點我點我點我點我點我點我點我點我點我點我點我點我 二分答案 貪心 首先,分析題目,求最大值的最小化,直接聯想到二分,so我們直接二分答案,關鍵是要怎麼去高效的check,因為大家很容想到字首和,但實際上這個空間是可以省略的,為什麼呢?我們考慮乙個貪心的思路,能加的就加上,不能則新開一...