1023: 修路
Submit Page Summary Time Limit: 1 Sec Memory Limit: 128 Mb Submitted: 588 Solved: 316Description
前段时间,某省发生干旱,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
中南大学第四届大学生程序设计竞赛Submit Page Summary
Copyright © 2016-2018 CSU ACM/ICPC TEAM. All Rights Reserved.
Designer & Developer : CSGrandeur. Any problem, Please Contact Us or Bug Feedback.
[THANKS TO] Web: ThinkPHP, Bootstrap, bootstrap-table and AlertifyJS; Judge Backend: zhblue/hustoj
题目链接,对修路时间进行二分,每一步再看所用工程队是否大于本有队伍数量
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int a[100010];
int m,n;//m表示路段的数量,n表示工程队的数量
bool judge(int tim){
int team=1,res=0;
for(int i=0;i<m;i++){
if(res+a[i]<=tim){
res=res+a[i];//如果修路的时间比二分时间短就继续用一个工程队继续修
}
else{
res=a[i];//如果比他长,就把当前这段换给领一个队伍修
team++;
if(res>tim) return 0;//这段路单独就比所修时间长
}
}
if(team>n) return 0;
else return 1;
}
int main(){
int t;
int temp;
cin>>t;
while(t--){
temp=0;
cin>>m>>n;
for(int i=0;i<m;i++){
cin>>a[i];
temp=temp+a[i];
}
int l=0,r=temp;
while(r>=l){
int mid=(l+r)/2;
if(judge(mid)) r=mid-1;
else l=mid+1;
}
cout<<l<<endl;
}
return 0;
}