IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> P1182 数列分段 Section II【题解】 -> 正文阅读

[数据结构与算法]P1182 数列分段 Section II【题解】

做法:贪心+二分

题意解读:

这题是我发的上一篇题解的题目的升级版。大意为给定一个长度为 N N N序列 a i ( i ∈ [ 1 , N ] , i ∈ N ? ) a_i(i\in[1,N],i\in\mathbb N^*) ai?(i[1,N],iN?),将其分成 M M M段,要求每段连续,并且使每段和的最大值最小

相信大家如果眼睛不瞎 ( L J Z : 我 瞎 呢 ) (LJZ:我瞎呢) (LJZ:)都能看到上面加粗的五个字:最大值最小。当题目中出现了类似的字眼时,就表示大概率这题的答案具有单调性,可以二分解决。 ( O W : 今 年 t g 必 考 二 分 ) (OW:今年tg必考二分) (OW:tg)

思路:

我们设这个最小值为 K K K。我们略加思考可以发现:当 K K K十分的小时,一定可以存在一种分组,使组数 M K > M ( 举 个 例 子 : 每 个 数 自 成 一 组 。 ) M_K>M(举个例子:每个数自成一组。) MK?>M,此时的 K K K值都是符合题意的。而当 K K K逐渐增长到一个临界点以后, M K M_K MK?将小于 M M M,此时的 K K K都不符合题意。所以这个临界点 ( 设 为 K 0 ) (设为K_0) (K0?)满足:
{ ? M x ∈ [ 1 , M 0 ] , M 均 符 合 题 意 。 ? M x ∈ ( M 0 , + ∞ ] , M 均 不 符 合 题 意 。 \begin{cases} \forall M_x\in[1,M_0],M均符合题意。\\ \forall M_x\in(M_0,+\infty],M均不符合题意。 \end{cases} {?Mx?[1,M0?],M?Mx?(M0?,+],M?
受到这个 M 0 M_0 M0?性质的启发,我们定义函数:

C ( x ) = { 0 , x > M 0 1 , x ≤ M 0 C(x)=\begin{cases} 0,x>M_0\\ 1,x\leq M_0 \end{cases} C(x)={0,x>M0?1,xM0??
然后取
l = x m i n = max ? ( a i ) , 即 M = n 。 r = x m a x = s u m ( a i ) , 即 M = 1 。 l=x_{min}=\max(a_i),即M=n。\\r=x_{max}=sum(a_i),即M=1。 l=xmin?=max(ai?)M=nr=xmax?=sum(ai?)M=1

二分求出临界值即可。

A C c o d e AC code ACcode:

#include<bits/stdc++.h>
using namespace std;

int n, m, a[100005],l,r;
long long s[100005];

inline void read()
{ 
    cin >> n >> m;
    for (int i = 1; i <= n;i++)
    {
        cin >> a[i];
        l = max(a[i], l);
        r += a[i];
    }
}

inline bool C(int x)
{
    int tot=0,num=0;
    for(int i=1;i<=n;i++)
    {
        if(tot+a[i]<=x)tot+=a[i];
        else tot=a[i],num++;
    }
    return num>=m;
}

int main()
{
    read();
    while(l<=r)
    {
        int mid=(l+r)>>1;
        if(C(mid))
        {
            l = mid+1;
        }
        else
        {
            r = mid-1;
        }
    }
    cout << l << endl;
    return 0;
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-03 17:18:25  更:2021-10-03 17:20:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 12:55:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码