洛谷P 181数列セグメントSection I


タイトルリンク
タイトルは、与えられた長さNの正の整数数列Aiについて説明し、これを連続するいくつかのセグメントに分割し、各セグメントとM(Mに等しくてもよい)を超えないようにし、少なくともどれだけのセグメントに分割して要求を満たすことができるかを問う.
入出力フォーマット入力フォーマット:
1行目は2つの正の整数Nを含み、Mは数列Aiの長さと各セグメントの和の最大値を表し、2行目はN個のスペースで区切られた非負の整数Aiを含み、タイトルに記載されている.
出力フォーマット:
正の整数で、最小分割されたセグメント数を出力します.
入出力サンプル入力サンプル#1:
5 6 4 2 4 5 1出力サンプル#1:
3説明20%のデータに対して、N≦10
40%のデータに対して、N≦1000
100%のデータに対して、N≦100000、M≦109があり、Mはすべての数の最小値より大きく、Aiの和は10^9を超えない.
列を次のように分割します.
[4][24][51]
第1のセグメントとは4であり、第2のセグメントとは6であり、第3のセグメントとは6であり、いずれもM=6を満たし、超えず、3が最も少ない分割のセグメント数であることを証明することができる.
考え方:欲張り.現在の要素については、他のセグメントと個別のセグメントの2つの選択しかありません.現在の要素が一緒にいるセグメントを見つけることができれば、見つからないのは自分のセグメントです.
コード:
#include
using namespace std;
int n, m, num[100010] = {
     0}, count = 1;
int main()
{
     
	cin >> n >> m;
	for(int i = 0; i < n; i++)
		cin >> num[i];
	int sum = num[0];
	for(int i = 0; i < n; i++)
	{
     
		if(sum + num[i + 1] > m)
		{
     
			sum = 0;
			count++; 
		}
		sum += num[i + 1];
	}
	cout << count;
	return 0;
}