【貪心】數列分段II
阿新 • • 發佈:2018-12-06
數列分段II
時間限制: 1 Sec 記憶體限制: 128 MB
題目描述
對於給定的一個長度為N的正整數數列Ai,現要將其分成連續的若干段,並且每段和不超過M(可以等於M),問最少能將其分成多少段使得滿足要求。
輸入
第一行包含兩個正整數N,M,表示了數列Ai的長度與每段和的最大值;
第二行包含N個空格隔開的非負整數Ai。
輸出
僅包含一個正整數,輸出最少劃分的段數。
樣例輸入
複製樣例資料
5 6
4 2 4 5 1
樣例輸出
3
提示
對於20%的資料,有N≤10;
對於40%的資料,有N≤1000;
對於100%的資料,有N≤105,M≤109,M大於所有數的最大值,Ai之和不超過109
思路:count計數,便利陣列,將所有項加起來記為sum,如果sum>m了,就將i減一,往回退一個,將sum清零,count++。最後遍歷完了之後i=n了,再加一次。
程式碼如下:
#include <cstdio> #include <iostream> #include <cmath> #include <cstring> typedef long long ll; using namespace std; ll a[100000]; int main() { int n,m; int sum=0; int count=0; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%lld",&a[i]); for(int i=1;i<=n;i++) { sum+=a[i]; if(sum>m) { sum=0; count++; i--; } if(i==n) { count++; } } printf("%d",count); return 0; }