「One Book 1.1 Exercise 2」シリーズのセグメンテーション
【出典】
ワンパス質問バンク
-1428 LibreOJ-10006
vjudge
【タイトル説明】
与えられた長さは 正の整数列 、いくつかの連続したセクションに分割され、各セクションの合計が (と等しい )、少なくとも要件を満たすために分割できるセグメントの数を尋ねます。
【入力フォーマット】
行1には2つの正の整数が含まれています 、 、シーケンスを示す の長さと各合計の最大値。
行2には スペースで区切られた負でない整数 、被写体として。
【出力フォーマット】
分割されたセグメントの最小数を出力する正の整数。
【入力例】
5 6
4 2 4 5 1
【出力例】
3
【データ範囲】
のために データの%は、あります ;
のために データの%、あります ;
のために データの%、 、 、Mはすべての数値の最小値より大きい 合計は 。
【分析】
1つの質問は、比較的単純で貪欲です。
これはシミュレーション問題だと言えます。
- [i]の値がmになるかどうかを判別
- 合計がmより大きいかどうかを判断し、ans ++
- 最後の単一グループを判断する
とても簡単です。
書き方は2つありますが、どちらも正しいです。
[コード1]
#pragma GCC optimize(3,"Ofast","inline")
#pragma G++ optimize(3,"Ofast","inline")
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#define RI register int
#define re(i,a,b) for(RI i=a; i<=b; i++)
#define ms(i,a) memset(a,i,sizeof(a))
#define MAX(a,b) (((a)>(b)) ? (a):(b))
#define MIN(a,b) (((a)<(b)) ? (a):(b))
using namespace std;
typedef long long LL;
const int N=1e5+5;
int n,m;
int a[N];
int main() {
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++) scanf("%d",&a[i]);
int sum=0,ans=0;
for(int i=1; i<=n; i++) {
if(sum+a[i]>m) {
sum=a[i];
ans++;
} else sum+=a[i];
}
if(sum!=0) ans++;
printf("%d\n",ans);
return 0;
}
[コード2]
#pragma GCC optimize(3,"Ofast","inline")
#pragma G++ optimize(3,"Ofast","inline")
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#define RI register int
#define re(i,a,b) for(RI i=a; i<=b; i++)
#define ms(i,a) memset(a,i,sizeof(a))
#define MAX(a,b) (((a)>(b)) ? (a):(b))
#define MIN(a,b) (((a)<(b)) ? (a):(b))
using namespace std;
typedef long long LL;
const int N=1e5+5;
int n,m;
int a[N];
int main() {
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++) scanf("%d",&a[i]);
int sum=0,ans=1;
for(int i=1; i<=n; i++) {
if(sum+a[i]>m) {
sum=a[i];
ans++;
} else sum+=a[i];
}
printf("%d\n",ans);
return 0;
}