1. 程式人生 > >【貪心】數列分段II

【貪心】數列分段II

數列分段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;
}