九度1502(折半法)
来源:互联网 发布:hybbs2.0论坛源码 编辑:程序博客网 时间:2024/06/06 08:58
时间限制:1 秒
内存限制:128 兆
特殊判题:否
提交:62
解决:21
- 题目描述:
在印刷术发明之前,复制一本书是一个很困难的工作,工作量很大,而且需要大家的积极配合来抄写一本书,团队合作能力很重要。
当时都是通过招募抄写员来进行书本的录入和复制工作的, 假设现在要抄写m本书,编号为1,2,3...m, 每本书有1<=x<=100000页, 把这些书分配给k个抄写员,要求分配给某个抄写员的那些书的编号必须是连续的。每个抄写员的速度是相同的,你的任务就是找到一个最佳的分配方案,使得所有书被抄完所用的时间最少。
- 输入:
输入可能包含多个测试样例。
第一行仅包含正整数 n,表示测试案例的个数。
对于每个测试案例,每个案例由两行组成,在第一行中,有两个整数m和 k, 1<=k<=m<=500。 在第二行中,有m个整数用空格分隔。 所有这些值都为正且小于100000。
- 输出:
对应每个测试案例,
输出一行数字,代表最佳的分配方案全部抄写完毕所需要的时间。
- 样例输入:
29 3100 200 300 400 500 600 700 800 9005 4100 100 100 100 100
- 样例输出:
1700200
首先明确最小时间肯定介于均值与和之间,可以用折半法逐步缩小区间寻找答案。注意判断左右缩小区间的方法!
#include<iostream>#include<cstdio>using namespace std;
const int MAX=500+10;int a[MAX];int n,k;
bool judge(int num){ int i=0; int count=0; int tsum; while(i<n&&count<=k) { count++; tsum=0; while(i<n&&tsum+a[i]<=num) { tsum+=a[i]; i++; } } return count<=k;}
int main(){ int Left,Right,Sum; int t,i; cin>>t; while(t--) { scanf("%d%d",&n,&k); Sum=0; for(i=0;i<n;i++) { scanf("%d",&a[i]); Sum+=a[i]; } int Left=Sum/k; int Right=Sum; while(Left<=Right) { int Mid=(Left+Right)/2; if(judge(Mid)) { Right=Mid-1; // Left=Mid+1; } else { Left=Mid+1; // Right=Mid-1; } }
for(i=Right;i<=Left;i++) { if(judge(i)) printf("%d\n",i); } } return 0;}
- 九度1502(折半法)
- 九度1069:查找学生信息(折半||线性查找)
- 折半查找法(递归)
- 折半查找法
- 汇编折半查找法
- 折半查找法
- 折半查找法
- 折半法查找
- 折半查找法
- 折半查找法
- 折半查找法C++
- 折半查找法
- JAVA折半查找法
- 折半查找法
- 折半插入排序法
- NSArray 折半查找法
- 折半查找法
- 折半查找法
- oracle中查询所有外键引用到某张表的记录
- 函数 参数中有 final 含义
- static关键字的作用
- 华为内部面试题库---(16)
- 热迁移save分析(3)
- 九度1502(折半法)
- 精选面试算法的实现之一
- 实现dos real model下的TCP/IP编程(上)
- win7系统下安装SQL2005(SQL Server 2005)图文教程
- error C2036: “void *”: 未知的大小
- 实现单元测试
- DataGridView单元格合并(画边框实现)
- POI读取Excel方式两种遍历方式
- [小代码]从resources里播放视频文件