zoukankan      html  css  js  c++  java
  • 洛谷 P1181数列分段SectionI 【贪心】

    题目描述

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

    输入输出格式

    输入格式:

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

    输出格式:

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

    输入输出样例

    输入样例#1: 复制
    5 6
    4 2 4 5 1
    输出样例#1: 复制
    3

    说明

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

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

    对于100\%100%的数据,有N≤100000,M≤10^9N100000,M109,MM大于所有数的最小值,A_iAi之和不超过10^9109。

    将数列如下划分:

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

    第一段和为44,第22段和为66,第33段和为66均满足和不超过M=6M=6,并可以证明33是最少划分的段数。

    题意:

    把n个数列分成连续的m组,每一组的和不超过m

    思路:

    只要这一段连续的数列的和不超过m就尽量让他们成为一组。一个组能并多少并多少,一个数能尽量早被归进一个组就尽量早。

     1 //#include<bits/stdc++.h>
     2 #include<set>
     3 #include<iostream>
     4 #include<stdio.h>
     5 #include<stdlib.h>
     6 #include<cstring>
     7 #include<queue>
     8 #include<stack>
     9 #include<algorithm>
    10 
    11 using namespace std;
    12 
    13 int n, m;
    14 const int maxn = 1e5 + 5;
    15 int a[maxn];
    16 
    17 int main()
    18 {
    19     scanf("%d%d", &n, &m);
    20     for(int i = 0; i < n; i++){
    21         scanf("%d", &a[i]);
    22     }
    23     int cnt = 0, tsum = 0;
    24     for(int i = 0; i < n; i++){
    25         if(tsum + a[i] <= m){
    26             tsum += a[i];
    27         }
    28         else{
    29             tsum = a[i];
    30             cnt++;
    31         }
    32     }
    33     printf("%d
    ", cnt + 1);
    34     return 0;
    35 }
  • 相关阅读:
    大数的加法
    tomcat jdbc DataSource资料
    转 spring的事务传播
    jmeter系列七(Visualizer的TestElement-ResultCollector)
    jmeter系列六(processor)
    jmeter系列五(Config配置元素)
    jmeter系列四(Visualizer)
    jmeter系列三(控制器controller)
    jmeter系列二(jmeter engine相关)
    jmeter系列一(jmeter界面相关无TestBean)
  • 原文地址:https://www.cnblogs.com/wyboooo/p/10279394.html
Copyright © 2011-2022 走看看