题目描述

对于给定的一个长度为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 ,含义如题目所述。

输出格式:

一个正整数,即每段和最大值最小为多少。

输入输出样例

输入样例#1:

5 3
4 2 4 5 1
输出样例#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`的更多相关文章

  1. 洛谷 P1182 数列分段 Section II

    洛谷 P1182 数列分段 Section II 洛谷传送门 题目描述 对于给定的一个长度为N的正整数数列A-iA−i,现要将其分成M(M≤N)M(M≤N)段,并要求每段连续,且每段和的最大值最小. ...

  2. 洛谷 P1182 数列分段Section II Label:贪心

    题目描述 对于给定的一个长度为N的正整数数列A[i],现要将其分成M(M≤N)段,并要求每段连续,且每段和的最大值最小. 关于最大值最小: 例如一数列4 2 4 5 1要分成3段 将其如下分段: [4 ...

  3. 洛谷 P1182 数列分段`Section II`【二分答案】

    [代码]: #include<bits/stdc++.h> const double eps = 1e-8; const int maxn = 1e6+5; #define inf 0x3 ...

  4. 洛谷 1182 数列分段Section II

    [题解] 最大值最小化,那么一般要联想到二分.二分一个最大值,然后check一下能否分成小于等于m段即可. #include<cstdio> #include<algorithm&g ...

  5. P1182 数列分段Section II

    P1182 数列分段Section II 题目描述 对于给定的一个长度为N的正整数数列A[i],现要将其分成M(M≤N)段,并要求每段连续,且每段和的最大值最小. 关于最大值最小: 例如一数列4 2 ...

  6. P1182 数列分段`Section II` P1316 丢瓶盖 二分答案

    题目描述 对于给定的一个长度为N的正整数数列A-iA−i,现要将其分成M(M≤N)M(M≤N)段,并要求每段连续,且每段和的最大值最小. 关于最大值最小: 例如一数列4 2 4 5 142451要分成 ...

  7. 洛谷P1182 数列分段【二分】【贪心】

    题目:https://www.luogu.org/problemnew/show/P1182 题意: 有n个数,要分成连续的m段.将每段中的数相加,问之和的最大值的最小值是多少. 思路: 和P1316 ...

  8. luogu P1182 数列分段Section II

    题目描述 对于给定的一个长度为N的正整数数列A[i],现要将其分成M(M≤N)段,并要求每段连续,且每段和的最大值最小. 关于最大值最小: 例如一数列4 2 4 5 1要分成3段 将其如下分段: [4 ...

  9. 洛谷P1182数列分段

    题目描述 对于给定的一个长度为N的正整数数列A[i],现要将其分成M(M≤N)段,并要求每段连续,且每段和的最大值最小. 关于最大值最小: 例如一数列4 2 4 5 1要分成3段 将其如下分段: [4 ...

  10. P1182 数列分段`Section II`

    传送门 思路: 求数列每段和的最大值的最小值,很明显是用二分法求解,加贪心检验.本题关键是要怎么去高效的check,可以考虑一个贪心的思路,能加的就加上,不能则新开一段,so对于二分的值 u ,我们从 ...

随机推荐

  1. Android Studio 重写方法时参数命名异常

    Android Studio 重写方法时参数命名异常 Android Studio 重写方法时参数名称乱掉可以通过下载相应源码解决

  2. OneNote中添加代码问题

    OneNote是我最常用的笔记本,然而粘贴代码很麻烦,之前只能屏幕截图如Snipaste自带截图什么的,后来才知道win10自带有win+shift+s自动剪切到草图板上的功能, 然而还是很麻烦. 在 ...

  3. [SCOI2015]小凸玩矩阵

    Description: 给你一个n*m的网格,每个格子有一个数字,每行每列只能选一个数字,问所选数字中第k大的数字的最小值是多少 Hint: \(n \le 250\) Solution: 显然是二 ...

  4. 分布式、集群、微服务、SOA 之间的区别

    分布式:不同模块部署在不同服务器上 作用:分布式解决网站高并发带来问题 集群:多台服务器部署相同应用构成一个集群 作用:通过负载均衡设备共同对外提供服务 SOA:Service Oriented Ar ...

  5. Windows下Flume的安装

    flume(日志收集系统) Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集.聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据:同时,Flum ...

  6. [LeetCode] Exam Room 考试房间

    In an exam room, there are N seats in a single row, numbered 0, 1, 2, ..., N-1. When a student enter ...

  7. BurpSuite 代理设置的小技巧

    原文:https://www.anquanke.com/post/id/85925 作者:三思之旅 预估稿费:300RMB 投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿 在We ...

  8. Vue取消eslint语法限制

    话不多说,先上图: 当然,这里的警告我是知道怎么回事,原来eslint是一个语法检查工具,但是限制很严格,在我的vue文件里面很多空格都会导致红线警告(可以屏蔽),虽然可以屏蔽,但是在编译的时候老是会 ...

  9. 小程序----选择地理位置 ( wx.chooseLocation ) 和 获取地理位置 (wx.getSetting)

    问题来了:假如我第一次使用wx.chooseLocation()获取权限被拒绝,然后使用wx.getSetting()来重新获取权限该怎么做呢? 思路:wx.chooseLocation()有fail ...

  10. C# Winform ListView实现单元格双击复制内容到剪贴板

    private void listView_MouseDoubleClick(object sender, MouseEventArgs e) { ListView listview = (ListV ...