题解报告:P1182 数列分段 Section II(二分答案)

简介: 算法

飞机票


题意:

2.png



思路:

二分答案经典题,把每段和最大值的最小枚举出来用二分去找最小且可以分的段数不超过m的。

补充一下二分答案,名如其人 ,二分的方法枚举答案,并且枚举时判断这个答案是否可行。但是,二分并不是在所有情况下都是可用的,使用二分需要满足两个条件:

1.有上下界

2.区间有单调性

二分答案应该是在一个单调闭区间上进行的。也就是说,二分答案最后得到的答案应该是一个确定值,而不是像搜索那样会出现多解。二分一般用来解决最优解问题。

#include<bits/stdc++.>
using namespace std;
const int maxn=1e5+100;
int a[maxn];
int sum[maxn];
int   main()
{
    int n,m,i,j,ans=0,max1=0;
    cin>>n>>m;
    for(i=1;i<=n;i++){
        cin>>a[i];
        sum[i]+=(sum[i-1]+a[i]);
        max1=max(max1,a[i]);
        ans+=a[i];
    }
    int l=max1,r=ans,mid,anss=0x3f3f3f3f;
    while(l<=r){
        mid=(l+r)/2;
        int cnt=0,sum1=0;
        for(i=1;i<=n;i++){
            sum1+=a[i];
            if(sum1>mid) {
              sum1=a[i],cnt++;
            }
        }
        if(sum1>mid) {
               cnt++;
        }cnt++;
        if(cnt>m){
            l=mid+1;
        }
        else {
            anss=min(mid,anss);
            r=mid-1;
        }
    }
    cout<<anss<<endl;
    return 0;
}



相关文章
|
算法 C++
剑指offer(C++)-JZ41:数据流中的中位数(算法-排序)
剑指offer(C++)-JZ41:数据流中的中位数(算法-排序)
剑指offer(C++)-JZ41:数据流中的中位数(算法-排序)
|
5月前
|
存储 算法
经典的滑动窗口的题目 力扣 2799. 统计完全子数组的数目(面试题)
经典的滑动窗口的题目 力扣 2799. 统计完全子数组的数目(面试题)
|
7月前
|
vr&ar
【每日一题Day166】LC1053交换一次的先前排列 | 贪心
【每日一题Day166】LC1053交换一次的先前排列 | 贪心
72 1
|
7月前
|
存储 算法 vr&ar
☆打卡算法☆LeetCode 209. 长度最小的子数组 算法解析
☆打卡算法☆LeetCode 209. 长度最小的子数组 算法解析
|
人工智能 算法
代码随想录算法训练营第三十五天 | LeetCode 435. 无重叠区间、763. 划分字母区间、56. 合并区间
代码随想录算法训练营第三十五天 | LeetCode 435. 无重叠区间、763. 划分字母区间、56. 合并区间
65 0
|
算法 C++
剑指offer(C++)-JZ53:数字在升序数组中出现的次数(算法-搜索算法)
剑指offer(C++)-JZ53:数字在升序数组中出现的次数(算法-搜索算法)
|
算法 C++
剑指offer(C++)-JZ40:最小的K个数(算法-排序)
剑指offer(C++)-JZ40:最小的K个数(算法-排序)
|
人工智能 算法
每日算法系列【LeetCode 1053】交换一次的先前排列
每日算法系列【LeetCode 1053】交换一次的先前排列
|
存储
【每日一题Day60】LC1703得到连续 K 个 1 的最少相邻交换次数 | 中位数贪心
局部最优:x位于区间[p[0],p[k−1]]内部时【无论位于哪个位置】,到p[0]和p[k−1]的距离是定值p[k−1]−p[0],因此应使x xx位于所有区间的内部即中位数,使x xx到所有区间的距离为定值,此时能够达到全局最优
102 0
【每日一题Day60】LC1703得到连续 K 个 1 的最少相邻交换次数 | 中位数贪心
Leetcode-每日一题769. 最多能完成排序的块(贪心)
需要怎么分割序列才是个问题,题目其实给了提示因为序列里的数只能是[0, n-1]所以选择[l, r] 连续的序列中的数一定是 [l, r] 这段区间的数字,所以我们只需要遍历数组,去找这段区间内最大的数字,即边界值r,因为他才是决定边界的数字,每次我们到达了r这个位置就表示下一段区间。
68 0
Leetcode-每日一题769. 最多能完成排序的块(贪心)