Hust oj 1039 修路(二分)
2016-05-23 13:53
309 查看
修路 | ||||||
| ||||||
Description | ||||||
前段时间,某省发生干旱,B山区的居民缺乏生活用水,现在需要从A城市修一条通往B山区的路。假设有A城市通往B山区的路由m条连续的路段组成,现在将这m条路段承包给n个工程队(n ≤ m ≤ 300)。为了修路的便利,每个工程队只能分配到连续的若干条路段(当然也可能只分配到一条路段或未分配到路段)。假设每个工程队修路的效率一样,即每修长度为1的路段所需的时间为1。现在给出路段的数量m,工程队的数量n,以及m条路段的长度(这m条路段的长度是按照从A城市往B山区的方向依次给出,每条路段的长度均小于1000),需要你计算出修完整条路所需的最短的时间(即耗时最长的工程队所用的时间)。 | ||||||
Input | ||||||
第一行是测试样例的个数T ,接下来是T个测试样例,每个测试样例占2行,第一行是路段的数量m和工程队的数量n,第二行是m条路段的长度。 | ||||||
Output | ||||||
对于每个测试样例,输出修完整条路所需的最短的时间。 | ||||||
Sample Input | ||||||
2 4 3 100 200 300 400 9 4 250 100 150 400 550 200 50 700 300 | ||||||
Sample Output | ||||||
400 900 和poj上那道割绳子的题很像,经典的二分思路,分析题意可以知道最少花费是数组中元素的最大值,最多花费是元素的和,所以分别将他们赋给left和right,那么mid就是理想花费,对于每一个mid,都用for从1到n扫一边道路长度,看有几个长度和是超过mid的,也就是需要几个施工队,如果这个值比n小,说明mid偏大,则right = mid - 1。反之left = mid +1; #include<cstdio> #include<iostream> #include<algorithm> using namespace std; const int maxn = 305; int w[maxn]; int l[maxn]; int n,m; int main() { int t; scanf("%d",&t); while(t--) { scanf("%d%d",&m,&n); int right = 0,left = 0,mid; for(int i=0;i<m;i++) { scanf("%d",&l[i]); if(left < l[i]) left = l[i]; right += l[i]; } while(left <= right) { mid = (right + left) / 2; int temp = l[0]; int ans = 1; for(int i=1;i<m;i++) { if(temp + l[i] >= mid) { ans++; temp = l[i]; } else { temp += l[i]; } } if(ans > n) left = mid + 1; else right = mid - 1; } printf("%d\n",mid); } return 0; } |
相关文章推荐
- List 里面嵌套List<map>解析
- ASP.NET页面请求过程及生命周期管道事件
- 看《前端自学方法指导》记录
- 今天开始学习
- java 继承练习题5
- grunt 前端开发环境搭建
- 膜×大爷专用
- db_load 生成数据库文件
- Lucene全文搜索原理与使用
- ActiveMQ简述,使用
- 计算struct的大小
- Elasticsearch 基础教程
- TCP连接
- Android——selector背景选择器的使用详解(二)
- Android四大组件和fragment
- 我的android工作历程
- chrome安装插件,安装Postman
- 流行移动平台自动化框架逐项比拼
- PHP 汽车查询删除
- ZXing生成二维码