落谷P1181 数列分段Section I简单贪心

题目描述

对于给定的一个长度为 NNN 的正整数数列 AiA_iAi​ ,现要将其分成连续的若干段,并且每段和不超过 MMM (可以等于 MMM ),问最少能将其分成多少段使得满足要求。

输入输出格式

输入格式:

第1行包含两个正整数 N,MN,MN,M ,表示了数列 AiA_iAi​ 的长度与每段和的最大值,第 222 行包含 NNN 个空格隔开的非负整数 AiA_iAi​ ,如题目所述。

输出格式:

一个正整数,输出最少划分的段数。

输入输出样例

输入样例#1: 复制

5 6
4 2 4 5 1

输出样例#1: 复制

3

说明

对于 20%20\%20% 的数据,有 N≤10N≤10N≤10 ;

对于 40%40\%40% 的数据,有 N≤1000N≤1000N≤1000 ;

对于 100%100\%100% 的数据,有 N≤100000,M≤109N≤100000,M≤10^9N≤100000,M≤109 , MMM 大于所有数的最小值, AiA_iAi​ 之和不超过 109109109 。

将数列如下划分:

[4][24][51][4][2 4][5 1][4][24][51]

第一段和为 444 ,第 222 段和为 666 ,第 333 段和为 666 均满足和不超过 M=6M=6M=6 ,并可以证明 333 是最少划分的段数。

题目描述

对于给定的一个长度为 NNN 的正整数数列 AiA_iAi​ ,现要将其分成连续的若干段,并且每段和不超过 MMM (可以等于 MMM ),问最少能将其分成多少段使得满足要求。

输入输出格式

输入格式:

第1行包含两个正整数 N,MN,MN,M ,表示了数列 AiA_iAi​ 的长度与每段和的最大值,第 222 行包含 NNN 个空格隔开的非负整数 AiA_iAi​ ,如题目所述。

输出格式:

一个正整数,输出最少划分的段数。

输入输出样例

输入样例#1: 复制

5 6
4 2 4 5 1

输出样例#1: 复制

3

思路:此题也可以直接边读边进行判断,只是想练一下贪心而已

#include<bits/stdc++.h>
using namespace std;
int a[1000010],ans;
int main()
{
    int n,m;

    while(scanf("%d%d",&n,&m)!=EOF)
    {
        ans=n+1;//加一是因为后面把a[0]=0也带进去了
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            if((a[i]+a[i-1])<=m)
                {
                    a[i]+=a[i-1];
                    ans--;
                }

        }
        printf("%d",ans);
    }
    return 0;
}

说明

对于 20%20\%20% 的数据,有 N≤10N≤10N≤10 ;

对于 40%40\%40% 的数据,有 N≤1000N≤1000N≤1000 ;

对于 100%100\%100% 的数据,有 N≤100000,M≤109N≤100000,M≤10^9N≤100000,M≤109 , MMM 大于所有数的最小值, AiA_iAi​ 之和不超过 109109109 。

将数列如下划分:

[4][24][51][4][2 4][5 1][4][24][51]

第一段和为 444 ,第 222 段和为 666 ,第 333 段和为 666 均满足和不超过 M=6M=6M=6 ,并可以证明 333 是最少划分的段数。

猜你喜欢

转载自blog.csdn.net/sunpeishuai/article/details/81265980