数列分段II(信息学奥赛一本通 1436)(洛谷 1182)
时间:2019-08-21
本文章向大家介绍数列分段II(信息学奥赛一本通 1436)(洛谷 1182),主要包括数列分段II(信息学奥赛一本通 1436)(洛谷 1182)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
【题目描述】
对于给定的一个长度为N的正整数数列A[i],现要将其分成M(M≤N)段,并要求每段连续,且每段和的最大值最小。
关于最大值最小:
例如一数列4 2 4 5 1要分成3段
将其如下分段:
[4 2][4 5][1]
第一段和为6,第2段和为9,第3段和为1,和最大值为9。
将其如下分段:
[4][2 4][5 1]
第一段和为4,第2段和为6,第3段和为6,和最大值为6。
并且无论如何分段,最大值不会小于6。
所以可以得到要将数列4 2 4 5 1要分成3段,每段和的最大值最小为6。
【输入】
第1行包含两个正整数N,M,第2行包含N个空格隔开的非负整数A[i],含义如题目所述。
【输出】
仅包含一个正整数,即每段和最大值最小为多少。
【输入样例】
5 3 4 2 4 5 1
【输出样例】
6
最小值最大(或是最大值最小)问题,这类双最值问题常常选用二分法求解。本题就是一道典型的“二分答案”模型。
因为每段和最大值的取值区间是[ max(a[1],a[2],a[3]……a[n]) , sum(a[1],a[2],a[3]……a[n]) ],所以就二分l和r,令mid=l+r>>1,每次进行check,计算当mid为最大值的情况下可以分成的段数cnt,
-
若cnt>m,说明这个mid小了,则令l=mid+1;
-
若cnt<=m,说明这个mid大了,则令r=mid-1,由于此时cnt可能等于m,所以用ans记录下来;
详见代码——
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1e6+5; 4 int a[N]; 5 int n; 6 int m,q,w,ans,p,tot; 7 int read() 8 { 9 int f=1;char ch; 10 while((ch=getchar())<'0'||ch>'9') 11 if(ch=='-')f=-1; 12 int res=ch-'0'; 13 while((ch=getchar())>='0'&&ch<='9') 14 res=res*10+ch-'0'; 15 return res*f; 16 } 17 void write(int x) 18 { 19 if(x<0) 20 { 21 putchar('-'); 22 x=-x; 23 } 24 if(x>9)write(x/10); 25 putchar(x%10+'0'); 26 } 27 bool check(int s) 28 { 29 int cnt=1,now=0; 30 for(int i=1;i<=n;i++) 31 { 32 if(a[i]+now<=s)now+=a[i]; 33 else 34 { 35 cnt++; 36 now=a[i]; 37 } 38 } 39 return cnt<=m; 40 } 41 int main() 42 { 43 n=read();m=read();int ma=-1,sum=0; 44 for(int i=1;i<=n;i++) 45 { 46 a[i]=read(); 47 ma=max(ma,a[i]); 48 sum+=a[i]; 49 } 50 int l=ma,r=sum; 51 while(l<=r) 52 { 53 int mid=l+r>>1; 54 if(check(mid)) 55 { 56 ans=mid;r=mid-1; 57 } 58 else l=mid+1; 59 } 60 write(ans); 61 return 0; 62 }
原文地址:https://www.cnblogs.com/ljy-endl/p/11388118.html
- SpringMVC【开发Controller】详解
- 巧用外部表备份历史数据(r5笔记第62天)
- Github 项目推荐 | 最小化类 AlphaGo Zero 引擎 —— Nochi
- 半自动化运维之快速连接到指定环境(一) (r5笔记第61天)
- Spring【DAO模块】知识要点
- 浅谈exp/imp(上) (r5笔记第81天)
- Java高并发秒杀系统【观后总结】
- 【专业技术】引擎算法探究
- 阅读SSM项目之scm
- 阅读SSH项目之ERP
- Hybris商品图片导入与压缩有关的配置
- 一条sql语句的建议调优分析(r5笔记第73天)
- O API - REST APIs的替代品
- 【专业技术】从4行代码看右值引用
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 总在说 Spring Boot 内置了 Tomcat 启动,那它的原理你说的清楚吗?
- JavaScript 技巧篇-js增加延迟时间解决单击双击事件冲突,双击事件触发单击事件
- Python 技术篇-sha256()加密的使用方法,sha1、md5加密方法
- Python 技术篇-如何打印一段文字,用友云霸气控制台颜文字打印
- Python 技术篇-获取秒级时间戳、毫秒级时间戳
- Python 技术篇-基于随机数的uuid码的生成
- BAT 脚本技术-利用bat批处理脚本静态指定ip地址、自动获取ip地址设置
- Oracle 技巧篇-快速批量删除当前数据库连接的用户,一键清空所有session会话方法
- Spring Security 中如何细化权限粒度?
- 小书MybatisPlus第4篇-表格分页与下拉分页查询
- 小书MybatisPlus第3篇-自定义SQL
- Nginx + Spring Boot 实现负载均衡
- 小书MybatisPlus第2篇-条件构造器的应用及总结
- 一个案例演示 Spring Security 中粒度超细的权限控制!
- 信息收集之主机发现:nmap