CSU_1023_修路
来源:互联网 发布:笔记本电脑安装centos 编辑:程序博客网 时间:2024/04/29 21:09
1023: 修路
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 271 Solved: 139
[Submit][Status][Web Board]
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
24 3100 200 300 4009 4250 100 150 400 550 200 50 700 300
Sample Output
400900
HINT
Source
中南大学第四届大学生程序设计竞赛
很久之前这个题目百思不得其解,
现在看看就是一个简单的二分题目
二分一个修路的时间看能不能符合题目条件就可以了
#include <iostream>#include <stdio.h>using namespace std;const int M=305;const int MT=300*1000+5;int p[M];int isc(int m,int n,int t) //该时间下能否完成修路任务{ int co=1; int su=0; for(int i=1;i<=m;i++) { if(p[i]>t) //每段路必须不长于时间 return 0; if(su+p[i]<=t) su+=p[i]; else { su=p[i]; co++; } } return co<=n;}int bs(int m,int n){ int lo=0,hi=MT; int mid,ans=MT; while(lo<=hi) { mid=(lo+hi)/2; if(isc(m,n,mid)) { ans=min(ans,mid); hi=mid-1; } else lo=mid+1; } return ans;}int main(){ int t,n,m; scanf("%d",&t); while(t--) { scanf("%d%d",&m,&n); for(int i=1;i<=m;i++) scanf("%d",&p[i]); printf("%d\n",bs(m,n)); } return 0;}
0 0
- CSU_1023_修路
- 修路
- 修路方案
- 1046修路
- 修路方案
- 修路方案
- [JZOJ4629] 修路
- 【JZOJ4629】修路
- BZOJ4774 修路
- [BZOJ4774]修路
- 山区修路
- 山区修路
- ACM;修路;3星;
- HDU 4081 秦始皇修路
- 修路方案 nyoj
- NYOJ118 修路方案
- 【pongo】【修路】【个人想法】
- BOJ 447. 修路
- 在非Activity类中用Intent实现Activity跳转
- 推荐几个机器学习算法及应用领域相关的中国大牛
- HDU 1576 A/B (逆元求扩展欧几里得)
- 快速排序
- JS-进阶-JS DOM常用的节点操作
- CSU_1023_修路
- 如何查看JDK以及JAVA框架的源码
- window上用cmd,把sqlite3的整个库按表导出到一个目录
- UIActivityIndicatorView和UIProgressView进度提示器
- C++--------------------------------------获得整数数组第二大的数
- 虚拟机linux克隆后网卡不能用
- Linux战地日记——名词解释
- 黑马程序员—集合框架(2)
- JavaScript中单引号和双引号的区别