积分赛 (三)CSU - 1023 【二分】

1023: 修路

Submit Page      Summary      Time Limit: 1 Sec       Memory Limit: 128 Mb       Submitted: 588       Solved: 316    

Description

前段时间,某省发生干旱,B山区的居民缺乏生活用水,现在需要从A城市修一条通往B山区的路。假设有A城市通往B山区的路由m条连续的路段组成,现在将这m条路段承包给n个工程队(≤ ≤ 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

Back to top

Copyright © 2016-2018 CSU ACM/ICPC TEAM. All Rights Reserved.
Designer & Developer : CSGrandeur. Any problem, Please Contact Us or Bug Feedback.

[THANKS TO] Web: ThinkPHPBootstrapbootstrap-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;
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值