题目:

给 n 个正整数 a_1,…,a_n, 将 n 个数顺序排成一列后分割成 m 段,每一段的分数被记为这段内所有数的和,该次分割的分数被记为 m 段分数的最大值。问所有分割方案中分割分数的最小值是多少?

    • 输入描述: 
      第一行依次给出正整数 n, m。 
      第二行依次给出n 个正整数 a1,...,ana1,...,an。

    • 示例:

      输入 
      5 3 
      1 4 2 3 5 
      输出 
      5

    • 说明 
      分割成 1 4 | 2 3 | 5 的时候三段的分数都为 5,得到分割分数的最小值。

    • 备注: 
      对于所有的数据,有 m <= n <= 100000,0 <= aiai <= 2^39。

    • 思路

      1. 将 n 个数划分为 n 段,分割分数即为 n 个正整数的最大值;
      2. 将 n 个数划分为 1 段,分割分数即为 n 个正整数的和;
      3. 若分为 m 段,则分割分数一定介于最大值与和之间。因此采用二分查找,每次取一个值对序列进行划分,若能划分出 
        m 段,使得每段的和都小于这个数值,则满足划分,反之不满足,直至找到一个最小的满足划分的值为止。
    • 代码实现如下:

#include <iostream>
using namespace std; int Judge(int data[], int sum, int m, int n);
int Binary_Search(int data[], int left, int right, int m, int n); int main()
{
int n = , m = ;
cin >> n >> m; int data[n];
int max_num = ;
int sum = ; int i = ; for(i = ; i < n ; i++)
{
cin >> data[i];
if (data[i] > max_num)
{
max_num = data[i];
}
sum += data[i];
} cout << Binary_Search(data, max_num, sum, m, n); return ;
} int Binary_Search(int data[], int left, int right, int m, int n)
{
int mid = ; while (left < right)
{
mid = left + (right - left) / ;
if (Judge(data, mid, m, n)) //满足划分,继续向左寻找
{
right = mid;//不减是因为无法确保减一之后的数是否满足划分
}
else //不满足划分,继续向右寻找
{
left = mid + ;
}
} return left;
} int Judge(int data[], int mid, int m, int n)
{
int cnt = ;
int sum = ; for (int i = ; i < n; i++)
{
if (sum + data[i] > mid) //累加和大于 mid,进行一次划分
{
sum = data[i];
cnt++;
if (cnt > m - ) //划分次数大于 m-1,不满足划分
{
return ;
}
}
else
{
sum += data[i];
}
} return ;
}

个人见解,如有错误,欢迎指正与交流!

获取更多精彩,请关注「seniusen」!

 

今日头条 2018 AI Camp 5 月 26 日在线笔试编程题第二道——最小分割分数的更多相关文章

  1. 今日头条 2018 AI Camp 5 月 26 日在线笔试编程题第一道——最佳路径

    题目 给定一个 n*m 的矩阵 A ,矩阵中每一个元素为一个十六进制数.寻找一条从左上角都右下角的路径,每次只能向右或者向下移动, 使得路径上所有数字之积在 16 进制下的后缀 0 最少. 输入描述: ...

  2. 今日头条 2018 AI Camp 6 月 2 日在线笔试编程题第二道——两数差的和

    题目 给 n 个实数 a_1, a_2 ... a_n, 要求计算这 n 个数两两之间差的绝对值下取整后的和是多少. 输入描述 第一行为一个正整数 n 和一个整数 m.接下来 n 行,第 i 行代表一 ...

  3. 今日头条 2018 AI Camp 6 月 2 日在线笔试编程题第一道——最大连续区间和扩展

    题目 给出一个长度为 n 的数组a1.a2.....ana1.a2.....an,请找出在所有连续区间 中,区间和最大同时这个区间 0 的个数小于等于 3 个,输出这个区间和. 输入描述: 第一行一个 ...

  4. 今日头条 2018 AI Camp 视频面试

    1. 本次面试是在牛客网平台进行的,没有涉及到技术细节,面试官也说仅仅是聊天.但是,不知道是网络卡顿还是平台缘故,连接非常不稳定,经常听不到声音,对方那边噪音也特别大,面试体验不是很好. 2. 面试时 ...

  5. 链家2018春招C/C++开发实习生在线考试编程题

    题目一 题解:该题目意思就是让你输入n组数据,然后求并集,利用STL容器set集合的特性:元素不重复存储,我们可以很轻易得出答案 #include <iostream> #include ...

  6. [转帖]ARM A77+G77最强公版架构:联发科5G SoC计划11月26日发布

    ARM A77+G77最强公版架构:联发科5G SoC计划11月26日发布 https://www.cnbeta.com/articles/tech/909025.htm 主流的手机SoC厂商已经纷纷 ...

  7. 2016年12月26日 星期一 --出埃及记 Exodus 21:21

    2016年12月26日 星期一 --出埃及记 Exodus 21:21 but he is not to be punished if the slave gets up after a day or ...

  8. 10月26日 奥威Power-BI基于微软示例库(MSOLAP)快速制作管理驾驶舱 腾讯课堂开课啦

    本次课是基于olap数据源的案例实操课,以微软olap示例库Adventure Works为数据基础.        AdventureWorks示例数据库为一家虚拟公司的数据,公司背景为大型跨国生产 ...

  9. 2016年11月26日 星期六 --出埃及记 Exodus 20:17

    2016年11月26日 星期六 --出埃及记 Exodus 20:17 "You shall not covet your neighbor's house. You shall not c ...

随机推荐

  1. java中强引用、软引用、弱引用、幻象引用有什么区别?分别使用在什么场景?

    不同的引用类型,主要体现在对象的不同可达性(reachable)状态和对垃圾收集的影响. 1.强引用是我们最常见的普通对象引用,只要还有强引用指向一个对象,就表明对象还"活着",垃 ...

  2. 基于多用户的Oracle数据泵导入导出数据

    登陆SqlPlus: SqlPlus sys/syspwd@MyOrcl AS sysdba 其中:syspwd:sys的登陆密码:MyOrcl:所创建的数据库服务名. 创建数据泵: create o ...

  3. JavaScript小练习3-用循环使三个DIV变色

    题目 初始为黑色,点击后为红色,再次点击为黑色,以后每次点击一次变色. 分析 简单的onclick使用. button的居中可以在外套一个p元素,body中让p居中即可. 三个DIV块的居中,使用ma ...

  4. LeetCode 中级 - 组合总和(105)

    给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的数字可以无限制重复被选 ...

  5. anyconnect connection attempt has failed

    anyconnect connection attempt has failed 在控制面板-网络与Internet-网络连接,右键AnyConnect secure连接适配器,点击属性 在连接项目中 ...

  6. Linux系统中的vi/vim指令【详解】

    vi是Unix世界里极为普遍的全屏幕文本编辑器,vim是它的改进版本Vi IMproved的简称.几乎可以说任何一台Unix机器都会提供这套软件. 只要简单的在Shell下执行vi就可以进入 vi 的 ...

  7. rz/sz:工作原理

    我们知道用linux命令rz/sz可以通过一些终端软件如secureCRT等在linux服务器与本地windows之间传文件.在服务器上rz一下,在本地windows下就跳出一个窗口,选择文件后就传到 ...

  8. react组件间传值详解

    一.父子组件间传值     <1>父传子         父组件:

  9. 用kubeadm构建k8s集群部署

    一.环境 三台centos机器 二.软件及容器准备 1.安装docker环境 本例安装 docker-ce版本,repo源为docker-ce.repo文件,拷贝到 /etc/yum.repos.d下 ...

  10. go字符串操作

    在Go语言标准库中的strings和strconv两个包可以对字符串做快速处理 string包 func Contains(s, substr string) bool 字符串s中是否包含substr ...