首页 > 其他分享 >数列分段 Section I

数列分段 Section I

时间:2023-06-17 09:12:01浏览次数:46  
标签:数列 int sum ans 这段 Section 分段

数列分段 Section I

题目描述

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

输入格式

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

输出格式

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

样例 #1

样例输入 #1

5 6
4 2 4 5 1

样例输出 #1

3

提示

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

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

对于\(100\%\)的数据,有\(N≤100000,M≤10^9\),\(M\)大于所有数的最大值,\(A_i\)之和不超过\(10^9\)。

将数列如下划分:

\([4][2 4][5 1]\)

第一段和为\(4\),第\(2\)段和为\(6\),第\(3\)段和为\(6\)均满足和不超过\(M=6\),并可以证明\(3\)是最少划分的段数。

解析

贪心

步骤:

  1. 每次判断\(sum+\)当前数列长度 是否 \(<m\),如果\(<\)则\(sum+\)当前数。\(sum\)代表的就是当前段的总长度,这段话则表示当前段还能容纳下这段数列。

  2. 如果\(\geq m\),则需要成立一个新的段。则\(ans++\),\(ans\)表示总段数。如果正好\(sum=m\),则代表上一段没有剩余,如果有剩余的话,就不能将这段数列包含进去,所以\(sum=a_i\),就将这段数列作为新段的开头。

  3. 最后如果\(sum>0\),则代表还有数没有被分段,所以\(ans++\)。输出\(ans\)。

代码

#include <bits/stdc++.h>
using namespace std;  
int a[100010],ans,sum;  //定义变量
int main()
{
	int n,m;
	cin >> n >> m;   
	for(int i=1;i<=n;i++)
	{
		cin >> a[i];       //输入
	}
	for(int i=1;i<=n;i++)
	{
		if(sum+a[i]<m) 
		{
			sum+=a[i]; //判断是否可以入段
		}
		else{
			ans++; //不可入段则总段数++
			if(sum+a[i]>m)
			{
				sum=a[i]; //判断有剩余的情况,如果有就不能将这段数列包含进去,就将这段数列作为新段的开头。
			}
			else{ 
				sum=0; //没有剩余则段的长度归0
			}
		}
	}
	if(sum>0)
	{//判断一个数还没有被分段的特殊情况
		ans++;
	}
	cout << ans; //输出总段数
	return 0;  
}

标签:数列,int,sum,ans,这段,Section,分段
From: https://www.cnblogs.com/momotrace/p/p1181.html

相关文章

  • AtCoder Beginner Contest 251 G Intersection of Polygons
    洛谷传送门AtCoder传送门经典结论,一个点\(P(x,y)\)在一个凸多边形内部\(S=\{(x_i,y_i)\}\)的充要条件是\(\foralli\in[1,n],(x_{i+1}-x_i,y_{i+1}-y_i)\times(x-x_i,y-y_i)\ge0\),其中\(S\)的点按照逆时针排列。然后我们运用叉积的一个性质......
  • QString::section详解
    目录section()函数简介section()声明start,end含义flags参数示例section()函数简介网上有很多关于Qt中字符串工具函数QString::section的描述,但大多描述不够清晰、直接。本文从官方文档入手,详细讲解如何使用section。QString::section可用来分隔字符串,与QString::split区别是......
  • 外观数列
    外观数列题目:给定一个正整数n,输出外观数列的第n项。「外观数列」是一个整数序列,从数字1开始,序列中的每一项都是对前一项的描述。你可以将其视作是由递归公式定义的数字字符串序列:countAndSay(1)=“1”countAndSay(n)是对countAndSay(n-1)的描述,然后转换成另一个数字......
  • [SDOI2008] 递归数列
    题面一个由自然数组成的数列按下式定义:对于\(i\lek\):\(a_{i}=b_{i}\)。对于\(i>k\):\(\displaystylea_{i}=\sum_{j=1}^{k}{c_{j}\timesa_{i-j}}\)。其中\(b_{1\dotsk}\)和\(c_{1\dotsk}\)是给定的自然数。写一个程序,给定自然数\(m\len\),计算\(\left(\su......
  • 算法题:求解斐波那契数列
    概念:斐波那契数列是指以0,1开始,之后每一项都等于前两项之和的数列,即:0,1,1,2,3,5,8,13,21,34,55,89,144……以此类推。这个数列最早是由13世纪意大利数学家斐波那契提出的,并在数学、自然科学和计算机科学等领域有着广泛的应用。题目:若有一只兔子,它每个月生一只小兔子,而小兔子......
  • Intersection Observer
    IntersectionObserver在日常开发中,经常会遇到对数据、图片进行懒加载的处理,要判断用户是否已经看到了数据或者图片。之前用的方法是通过听到scroll事件或者使用setInterval来判断,这种方法的缺点是,由于scroll事件触发频率高,计算量很大,如果不做防抖节流的话,很容易造成性能问题,而se......
  • 等差数列
    题目:/***等差数列:*求等差数列前N项的级数之和。不考虑不合理的输入等特殊情况*输入N,首项M,差值K,整型,空格分隔。*/解答:classTest93{publicstaticvoidmain(String[]args){Scannerinput=newScanner(System.in);//codehere......
  • Luogu P1939 【模板】矩阵加速(数列)
    【模板】矩阵加速(数列)题目描述已知一个数列\(a\),它满足:\[a_x=\begin{cases}1&x\in\{1,2,3\}\\a_{x-1}+a_{x-3}&x\geq4\end{cases}\]求\(a\)数列的第\(n\)项对\(10^9+7\)取余的值。输入格式第一行一个整数\(T\),表示询问个数。以下\(T\)行,每行一个正......
  • 计算斐波那契数列的前 N 项
    它使用C++11中的多线程库thread来并行计算斐波那契数列的前N项:#include<iostream>#include<thread>#include<vector>voidfib(std::vector<int>&fib,intstart,intend){for(inti=start+2;i<end;i++){fib[i]=fib[i-1]+......
  • 判断两个矩形是否相交(Rect Intersection)
    0x00Preface最近在开发一个2D组态图形组件的过程中,里面的数学模块,涉及到两个矩形是否相交的判断。这个问题很多年前就写过,算是个小的算法吧。网络上搜索一下,有很多思路,有一些思路要基于多种组合的判断,显得比较复杂。比如两个矩形相交的情形,可能有下面的多种类型:而每种类型......