信息学奥赛一本通 1436:数列分段II | 洛谷 P1182 数列分段 Section II

news2024/12/26 22:03:39

【题目链接】

ybt 1436:数列分段II
洛谷 P1182 数列分段 Section II

【题目考点】

1. 二分答案
2. 贪心

【解题思路】

求最大值最小问题,一般可以使用二分解决。
原题是寻找一种能使得最大子段和最小的子段划分方案。正向思维是先进行子段划分,而后记录该划分下的最大子段和。穷举所有子段划分的情况,求最大子段和的最小值。但是子段划分的情况很多,如果枚举所有子段划分的方案,必然超时。
此处可以进行反向思考,上来就确定子段划分的最大子段和不能超过某一数值,而后看否存在满足这一要求的子段划分方案。通过二分算法,不断选取最大子段和不能超过的数值,最后就可以确定最大子段和的最小值。
二分算法可以将枚举所有方案问题转为判定一个方案是否可行的问题。
设二分答案的取值范围:

  • 最小值l:由于序列中的数字都是正整数,那么所有数字的加和一定大于0,因此最小值l设为0。
  • 最大值r:可以设为序列中所有数值的加和,也可以设一个一定大于等于所有数加和的很大的数字,该题说答案不超过 1 0 9 10^9 109,因此最大值r就可以设为 1 0 9 10^9 109

该题求的是不同的将序列划分为M个子段的方案中的最大子段和的最小的方案的最大子段和,这是求满足某一条件最小值的问题,可以使用相应的二分答案写法完成。
答案x需要满足的条件为:在最大子段和小于等于数值x的前提下,是否可能存在一种将序列划分为M个子段的划分方案。
最大子段和小于等于数值x,也就是所有子段的子段和都不能超过x。
如果序列中某个数大于x,这一个数构成的子段就已经大于x了,不满足上述要求,因此该情况不满足条件。
我们可以通过贪心算法求出:在所有子段的子段和都小于等于数值x的前提下,序列可以划分成的最少子段数,具体方法见信息学奥赛一本通 1428:数列分段 | 洛谷 P1181 数列分段 Section I。

  • 如果划分成的最少子段数小于等于M,那么可以继续将任意子段继续划分为多个子段,直到子段数量等于M个(已知元素个数N大于等于M,因此这N个数一定可以分成M个子段)。因为每个数字都大于0,继续划分出的子段的加和只可能比原子段的加和更小,因此仍满足各子段的最大子段和小于等于x,此时答案x满足条件。
  • 如果划分成的最少子段数大于M,则答案x不满足条件。

最后输出二分答案的结果。

【题解代码】

解法1:二分答案
  • 写法1:
#include<bits/stdc++.h>
using namespace std;
int a[100005], n, m;
bool check(int x)//满足每个子段的和<=x 
{
	int sum = 0, ct = 1;
	for(int i = 1; i <= n; ++i)
	{
		if(a[i] > x)
			return false;
		if(sum+a[i] <= x)
			sum += a[i];
		else
		{
			ct++;
			sum = a[i];
		}
	}
	return ct <= m;
}
int main()
{
	cin >> n >> m;
	for(int i = 1; i <= n; ++i)
		cin >> a[i];
	int l = 0, r = 1e9;
	while(l < r)
	{
		int mid = (l+r)/2;
		if(check(mid))
			r = mid;
		else
			l = mid+1;
	}
	cout << l;
	return 0;
}
  • 写法2:
#include<bits/stdc++.h>
using namespace std;
int a[100005], n, m, tsum;
bool check(int x)//满足每个子段的和<=x 
{
	int sum = 0, ct = 1;
	for(int i = 1; i <= n; ++i)
	{
		if(a[i] > x)
			return false;
		if(sum+a[i] <= x)
			sum += a[i];
		else
		{
			ct++;
			sum = a[i];
		}
	}
	return ct <= m;
}
int main()
{
	cin >> n >> m;
	for(int i = 1; i <= n; ++i)
	{
		cin >> a[i];
		tsum += a[i];//tsum:所有数字的加和 
	}
	int l = 0, r = tsum;
	while(l <= r)
	{
		int mid = (l+r)/2;
		if(check(mid))
			r = mid-1;
		else
			l = mid+1;
	}
	cout << l;
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2252493.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JAVA篇10 —— 常用类WrapperStringMathArraysSystemBigIntegerBigDecimal日期

欢迎来到我的主页&#xff1a;【一只认真写代码的程序猿】 本篇文章收录于专栏【小小爪哇】 如果这篇文章对你有帮助&#xff0c;希望点赞收藏加关注啦~ 目录 1 包装类 1.1 包装类和String 1.2 int&char包装类常用方法 2 String类 3 Math 类 4 Arrays类 5 System类…

tauri使用github action打包编译多个平台arm架构和inter架构包踩坑记录

这些error的坑&#xff0c;肯定是很多人不想看到的&#xff0c;我的开源软件PakePlus是使用tauri开发的&#xff0c;PakePlus是一个界面化将任何网站打包为轻量级跨平台软件的程序&#xff0c;利用Tauri轻松构建轻量级多端桌面应用和多端手机应用&#xff0c;为了实现发布的时候…

通义灵码走进北京大学创新课堂丨阿里云云原生 10 月产品月报

云原生月度动态 云原生是企业数字创新的最短路径。 《阿里云云原生每月动态》&#xff0c;从趋势热点、产品新功能、服务客户、开源与开发者动态等方面&#xff0c;为企业提供数字化的路径与指南。 趋势热点 &#x1f947; 通义灵码走进北京大学创新课堂&#xff0c;与 400…

鸿蒙开发-HMS Kit能力集(地图服务、华为支付服务)

地图服务 Map Kit&#xff08;地图服务&#xff09;是鸿蒙生态下的一个地图服务&#xff0c;为开发者提供强大而便捷的地图能力&#xff0c;助力全球开发者实现个性化地图呈现、地图搜索和路线规划等功能&#xff0c;轻松完成地图构建工作。 Map Kit提供了千万级别的 Poi&…

【四轴】基于IIC通信读写MPU6050寄存器

1. 基本原理 在这篇【四轴】软件IIC通信的实现 – Dukis Blog博客中&#xff0c;我介绍了软件IIC的实现方式。而MPU6050&#xff0c;正是一种通过IIC进行通信的传感器外设。 1.1 什么是MPU6050 MPU6050 是 InvenSense 公司推出的一款6 轴惯性传感器模块&#xff0c;广泛应用于姿…

arkTS:使用ArkUI实现用户信息的持久化管理与自动填充(PersistentStorage)

arkUI&#xff1a;使用ArkUI实现用户信息的持久化管理与自动填充&#xff08;PersistentStorage&#xff09; 1 主要内容说明2 例子2.1 登录页2.1.1登陆页的相关说明2.1.1.1 持久化存储的初始化2.1.1.2 输入框2.1.1.3 记住密码选项2.1.1.4 登录按钮的逻辑2.1.1.5 注册跳转 2.1.…

基于SpringBoot+Vue的美妆购物网站

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

【SpringBoot+Vue】x-admin管理系统跟做

技术栈 前端技术说明Vue前端框架Vuex全局状态管理框架ElementUI前端UI框架Axios前端HTTP框架vue-element-admin项目脚手架 后端技术说明SpringBoot容器MVC框架MyBatisORM框架MyBatis-plusMyBatis增强工具Redis非关系型数据库 数据库准备 SET NAMES utf8mb4; SET FOREIGN_KE…

【Docker】Docker配置远程访问

配置Docker的远程访问&#xff0c;你需要按照以下步骤进行操作&#xff1a; 1. 在Docker宿主机上配置Docker守护进程监听TCP端口 Docker守护进程默认只监听UNIX套接字&#xff0c;要实现远程访问&#xff0c;需要修改配置以监听TCP端口。 ‌方法一&#xff1a;修改Docker服务…

LeetCode hot100(自用背诵、部分题目、非最优解)

点击题目可以跳转到LeetCode 哈希 两数之和 public int[] twoSum(int[] nums, int target) {int lengthnums.length;int[] ans new int[2];for (int i 0; i <length-1 ; i) {for (int j i1; j < length; j) {if(nums[i]nums[j]target){ans[0]i;ans[1]j;}}}return an…

Android -- 简易音乐播放器

Android – 简易音乐播放器 播放器功能&#xff1a;* 1. 播放模式&#xff1a;单曲、列表循环、列表随机&#xff1b;* 2. 后台播放&#xff08;单例模式&#xff09;&#xff1b;* 3. 多位置同步状态回调&#xff1b;处理模块&#xff1a;* 1. 提取文件信息&#xff1a;音频文…

基础Web安全|SQL注入

基础Web安全 URI Uniform Resource Identifier&#xff0c;统一资源标识符&#xff0c;用来唯一的标识一个资源。 URL Uniform Resource Locator&#xff0c;统一资源定位器&#xff0c;一种具体的URI&#xff0c;可以标识一个资源&#xff0c;并且指明了如何定位这个资源…

ESG研究报告白皮书与ESG治理报告合集(2020-2023年)

一.资料范围&#xff1a;&#xff08;1&#xff09;ESG白皮书及指南;&#xff08;2&#xff09;ESG研究报告,&#xff08;3&#xff09;ESG治理报告分析&#xff08;4&#xff09;上市公司ESG报告&#xff08;知名企业&#xff09; 二、资料用途&#xff1a;可以分析研究企业E…

WPF指示灯的实现方式

WPF指示灯的实现方式 样式 XAML <Button x:Name"Btn1" Width"25" Height"25" Grid.Row"0" Grid.Column"1" Margin"10 5 5 5 "><Button.Template><ControlTemplate TargetType"Button"…

初识QT第一天

思维导图 利用Qt尝试做出原神登陆界面 import sys from PyQt6.QtGui import QIcon, QPixmap, QMovie from PyQt6.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QLineEdit# 封装原神窗口类 class Genshin(QWidget):# 构造函数def __init__(self):# 初始化父类…

【Linux】线程池设计 + 策略模式

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Linux 目录 一&#xff1a;&#x1f525; 线程池 1-1 ⽇志与策略模式1-2 线程池设计1-3 线程安全的单例模式1-3-1 什么是单例模式1-3-2 单例模式的特点1-3-3 饿汉实现⽅式和懒汉实现⽅式1-3-4 饿汉…

vim插件管理器vim-plug替代vim-bundle

文章目录 vim-plug与vim-bundle对比vim-plug安装vim-plug管理安装插件相关文章 vim-plug与vim-bundle对比 vim-plug 和 vim-bundle 都是 Vim 的插件管理器&#xff0c;但它们有一些关键的区别。以下是两者的主要对比&#xff1a; 易用性和简洁性 vim-plug: 易用性: vim-plug …

107.【C语言】数据结构之二叉树求总节点和第K层节点的个数

目录 1.求二叉树总的节点的个数 1.容易想到的方法 代码 缺陷 思考:能否在TreeSize函数内定义静态变量解决size的问题呢? 其他写法 运行结果 2.最好的方法:分而治之 代码 运行结果 2.求二叉树第K层节点的个数 错误代码 运行结果 修正 运行结果 其他写法 1.求二…

【代码随想录day48】【C++复健】739. 每日温度;496.下一个更大元素 I;503.下一个更大元素II

739. 每日温度 一顿操作猛如虎&#xff0c;一看击败5%。一眼顶针&#xff0c;鉴定为在存栈的时候把值和下标一起存了&#xff0c;所以导致了问题。 class Solution { public:vector<int> dailyTemperatures(vector<int>& temperatures) {stack<vector<…

vscode + conda + qt联合开发

安装vscode 安装conda 清华大学开源软件镜像(Anaconda下载)_清华大学镜像-CSDN博客 conda create新建一个环境&#xff0c;激活这个环境&#xff0c;然后安装pyside6 pip install pyside6 -i https://pypi.tuna.tsinghua.edu.cn/simple 安装成功后输入 pip list查看是否安装…