洛谷:P1182:数列分段`Section II`
题目描述
对于给定的一个长度为N的正整数数列 A-iA−i ,现要将其分成 M(M≤N)M(M≤N) 段,并要求每段连续,且每段和的最大值最小。
关于最大值最小:
例如一数列 4 2 4 5 142451 要分成 33 段
将其如下分段:
[4 2][4 5][1][42][45][1]
第一段和为 6 ,第 2 段和为 9 ,第 3 段和为 1 ,和最大值为 9 。
将其如下分段:
[4][2 4][5 1][4][24][51]
第一段和为 4 ,第 2 段和为 6 ,第 3 段和为 6 ,和最大值为 6 。
并且无论如何分段,最大值不会小于 66 。
所以可以得到要将数列 4 2 4 5 142451 要分成 3 段,每段和的最大值最小为 6 。
输入输出格式
输入格式:
第 1 行包含两个正整数N,M。
第 22行包含 NN 个空格隔开的非负整数 Ai ,含义如题目所述。
输出格式:
一个正整数,即每段和最大值最小为多少。
输入输出样例
5 3
4 2 4 5 1
6
说明
对于 20\%20% 的数据,有 N≤10N≤10 ;
对于 40\%40% 的数据,有 N≤1000N≤1000 ;
对于 100\%100% 的数据,有 N≤100000,M≤N, Ai,Ai 之和不超过 10^9 。
这个题时一个典型的二分答案(最大的最小、最小的最大)
首先根据题意,我们确定段的最大值一定在整个数组的最大值和10^9之间,因此做如下定义
l = maxn, r = 1000000000;
然后我们确定好一个mid = (l+r)>> 1,表示最大值为mid时是否可行;
下面就进行二分的正常过程,判断
然后遍历整个数列,记录下一个tot,表示这个数列中最大值不超过mid时,需要分成的段数,用now来代表当前段的和
now+a[i]<mid时:可以继续加,这个段还没有结束
now+a[i]==num时:说明当前段已经达到了最大值,记下这个段(tot++),now=0,以便分析下一个段
now+a[i]>num时:说明这个段加上a[i]之后超过mid,就不能加上这个a[i],那么这个段已经计算完(tot++),a[i]算到下一个段内
如果tot<m,说明要达到当前的段数m,mid的值必须要降低,这样才能使段数增多,收缩右边界;
否则,改变左边界。
附上代码(亲测AC)
#include<iostream>
#include<cmath>
using namespace std;
const int MAXN=;
int maxn = -;
int n, m, a[];
int l = maxn, r = ;
int judge(int num){
int now = ;
int tot = ;
for(int i=;i<=n;i++){
if(now+a[i]<num){
now += a[i];
}
else if(now+a[i]==num){
now = ;
tot++;
}
else if(now+a[i]>num){
now = a[i];
tot++;
}
}
if(now) tot++; //如果还有剩余的一个值,那么这个单独算一个段
if(tot>m)return ;
else return ; } int main(){
cin >> n >> m;
for(int i=;i<=n;i++) {
cin >> a[i];
maxn = max(a[i], maxn);
}
int l = maxn, r = ;
if(n==m){
cout << maxn;
return ;
}
while(l<r){
int mid = (l+r) >> ;
if(judge(mid)==){
r = mid;
}
else{
l = mid + ;
}
}
cout << r;
return ;
}
洛谷:P1182:数列分段`Section II`的更多相关文章
- 洛谷 P1182 数列分段 Section II
洛谷 P1182 数列分段 Section II 洛谷传送门 题目描述 对于给定的一个长度为N的正整数数列A-iA−i,现要将其分成M(M≤N)M(M≤N)段,并要求每段连续,且每段和的最大值最小. ...
- 洛谷 P1182 数列分段Section II Label:贪心
题目描述 对于给定的一个长度为N的正整数数列A[i],现要将其分成M(M≤N)段,并要求每段连续,且每段和的最大值最小. 关于最大值最小: 例如一数列4 2 4 5 1要分成3段 将其如下分段: [4 ...
- 洛谷 P1182 数列分段`Section II`【二分答案】
[代码]: #include<bits/stdc++.h> const double eps = 1e-8; const int maxn = 1e6+5; #define inf 0x3 ...
- 洛谷 1182 数列分段Section II
[题解] 最大值最小化,那么一般要联想到二分.二分一个最大值,然后check一下能否分成小于等于m段即可. #include<cstdio> #include<algorithm&g ...
- P1182 数列分段Section II
P1182 数列分段Section II 题目描述 对于给定的一个长度为N的正整数数列A[i],现要将其分成M(M≤N)段,并要求每段连续,且每段和的最大值最小. 关于最大值最小: 例如一数列4 2 ...
- P1182 数列分段`Section II` P1316 丢瓶盖 二分答案
题目描述 对于给定的一个长度为N的正整数数列A-iA−i,现要将其分成M(M≤N)M(M≤N)段,并要求每段连续,且每段和的最大值最小. 关于最大值最小: 例如一数列4 2 4 5 142451要分成 ...
- 洛谷P1182 数列分段【二分】【贪心】
题目:https://www.luogu.org/problemnew/show/P1182 题意: 有n个数,要分成连续的m段.将每段中的数相加,问之和的最大值的最小值是多少. 思路: 和P1316 ...
- luogu P1182 数列分段Section II
题目描述 对于给定的一个长度为N的正整数数列A[i],现要将其分成M(M≤N)段,并要求每段连续,且每段和的最大值最小. 关于最大值最小: 例如一数列4 2 4 5 1要分成3段 将其如下分段: [4 ...
- 洛谷P1182数列分段
题目描述 对于给定的一个长度为N的正整数数列A[i],现要将其分成M(M≤N)段,并要求每段连续,且每段和的最大值最小. 关于最大值最小: 例如一数列4 2 4 5 1要分成3段 将其如下分段: [4 ...
- P1182 数列分段`Section II`
传送门 思路: 求数列每段和的最大值的最小值,很明显是用二分法求解,加贪心检验.本题关键是要怎么去高效的check,可以考虑一个贪心的思路,能加的就加上,不能则新开一段,so对于二分的值 u ,我们从 ...
随机推荐
- 导航栏动态添加act属性
最近做了一个网站,需要设置导航栏的act属性,这里需要用到addClass以及removeClass: $('#topName li').removeClass('active'); $(this). ...
- 如何查看ubuntu系统版本信息
第一种方法: hadoop@master:~$ cat /proc/version Linux version 4.4.0-21-generic (buildd@lgw01-21):Linux内核版本 ...
- Android Architecture Components--项目实战
转载请注明出处,谢谢! 上个月Google Android Architecture Components 1.0稳定版发布,抽工作间隙写了个demo,仅供参考 Github地址:https://gi ...
- 替换url中的域名
/** * * @param domain 域名 * @param port 端口号 * @param url url路径 * @return ...
- [微信小程序]编译.wxss出错,2 not found
小程序新建项目就出错:2 not found 编译.wxss文件出错(不是一般的郁闷,新建项目就报错...) 大概的情况是开发工具没有更新.或更新不到, 第一,可以删掉开发工具重新下载最新安装: 第 ...
- Unity AssetBundle的几个加载方式
string path = @"AssetBundles/scene/cubewall.ab"; string cacheDownloadPath = @"file:// ...
- [译文]Domain Driven Design Reference(七)—— 大型战略设计结构
本书是Eric Evans对他自己写的<领域驱动设计-软件核心复杂性应对之道>的一本字典式的参考书,可用于快速查找<领域驱动设计>中的诸多概念及其简明解释. 上周末电脑硬盘文件 ...
- ML-Framework:ML.NET 0.3 带来新组件
ML.NET在今年微软在Build 2018 会议上宣布的机器学习框架现已正式推出0.3版本 https://github.com/dotnet/machinelearning/releases/ta ...
- [.net 面向对象程序设计深入](36)Redis——基础
[.net 面向对象程序设计深入](36)Redis——基础 很长一段时间没更新博客了,坚持做一件事,真不是件容易的事,后面我会继续尽可能的花时间更新完这个系列文章. 因这个系列的文章涉及的范围太大了 ...
- VSCode调试Flutter的问题解决
错误:Target of URI doesn't exist: package:fultter/material.dart 原因:flutter版本不匹配.flutter升级到了最新版本,而项目引用的 ...