美文网首页
邓俊辉算法训练营 -- 分组

邓俊辉算法训练营 -- 分组

作者: 拜仁的月饼 | 来源:发表于2019-05-21 17:05 被阅读0次

描述

有n个正整数排成一排,你要将这些数分成m份(同一份中的数字都是连续的,不能隔开),同时数字之和最大的那一份的数字之和尽量小。

输入

输入的第一行包含两个正整数n,m。

接下来一行包含n个正整数。

输出

输出一个数,表示最优方案中,数字之和最大的那一份的数字之和。

样例

样例输入

5 2
2 1 2 2 3

样例输出

5

样例解释

若分成2和1、2、2、3,则最大的那一份是1+2+2+3=8;

若分成2、1和2、2、3,则最大的那一份是2+2+3=7;

若分成2、1、2和2、3,则最大的那一份是2+1+3或者是2+3,都是5;

若分成2、1、2、2和3,则最大的那一份是2+1+2+2=7。

所以最优方案是第三种,答案为5。

提示

  • 大家记得看到“最大的最小”这一类语言,一定要想二分能不能做。
  • 我们二分最大的那一份的和d,然后从左向右分组,在一组中,在和不超过d的情况下尽量往右分。若最终分出来的组数小于等于m,则这显然是合法的(我们在分出来的组里随便找个地方切开,总能变到m组,且每组的和不超过d)
  • 这个d显然是单调的,即,若和不超过d能分成m组,则和不超过d+1也是能分成m组的,故二分正确。

Python 3代码实现(OJ通过100分)

#!/usr/bin/env pypy3
# -*- coding: UTF-8 -*-

# ================= 代码实现开始 =================

def check(d, n, m, a):
    sum = 0
    cnt = 1
    i = 0
    while (i < n):
        if a[i] > d:
            return False
        sum += a[i]
        i += 1
        if (sum > d):
            cnt += 1
            i -= 1
            sum = 0

    if (cnt > m):
        return False
    else:
        return True

# 将所给数组分成连续的m份,使得数字之和最大的那一份的数字之和最小
# n:数组大小
# m:题中的m
# a:所给数组,大小为n
# 返回值:最优方案中,数字之和最大的那一份的数字之和

def getAnswer(n, m, a):
    r = 0
    l = 1

    for i in range(n):
        r += a[i]

    while (l <= r):
        mid = (l + r) // 2 #这一步是分而治之的思想
        if (check(mid, n, m, a)):
            r = mid - 1
        else:
            l = mid + 1

    return (r + 1)

# ================= 代码实现结束 =================
if __name__ == "__main__":
    n, m = map(int, input().split())
    a = list(map(int, input().split()))
    print(getAnswer(n, m, a))

相关文章

  • 邓俊辉算法训练营 -- 分组

    描述 有n个正整数排成一排,你要将这些数分成m份(同一份中的数字都是连续的,不能隔开),同时数字之和最大的那一份的...

  • [小甲鱼] 数据结构与算法笔记01

    视频地址 为什么要写这个系列? 想当年,我的数据结构与算法是通过邓俊辉老师的《算法训练营》,一直在瞎练Leetco...

  • 邓俊辉算法训练营 -- 序列计数

    描述 给定一个n个整数的序列以及一个非负整数d,请你输出这个序列中有多少个连续子序列(长度大于1),满足该子序列的...

  • 一些未完成的计划

    完成邓俊辉老师的《数据结构与算法》的学习 完成CSAPP的学习以及相应的实验与南大的附加nemu 完成操作系统课程...

  • 那些B站上不可错过的学习视频

    计算机基础 清华大学邓俊辉邓公的《数据结构》https://www.bilibili.com/video/av49...

  • 长期计划安排

    一、数据结构与算法分析 参考书 数据结构与算法分析:C语言描述 算法(第四版) 算法导论 课程相关 MOOC 邓俊...

  • 反思,明天道歉

    今天要反思两件事,一件事情是邓俊华接手邓娜娜工作的事情,一件事是李承辉接管办公室事情,邓俊华的事情,下午回单位的时...

  • Java分组密码算法DES

    Java分组密码算法DES 1实验内容 掌握分组密码算法DES方法,能用高级语言实现分组密码算法DES。DES算法...

  • 数据结构mooc学习

    清华大学学堂在线 邓俊辉老师 deng@tsinghua.edu.cn 第1章 绪论 (a)计算 计算=信息处理 ...

  • 邓俊辉《数据结构》学习笔记

    P8 01-C-2 NotationMeaning大 记号给出复杂度的上界(即最坏的情形) 记号(也可以小写)给...

网友评论

      本文标题:邓俊辉算法训练营 -- 分组

      本文链接:https://www.haomeiwen.com/subject/aqnjzqtx.html