算法-电缆分割问题(分治,二分查找)

编程挑战描述:为了确保程序设计比赛的公平性,竞赛委员会要求所有参赛者使用相同长度的电缆连接到中心HUB。给定仓库中每根电缆的长度,目标是找出能分割成最多K根相同长度电缆的最大长度。要求使用分治法求解。输入包括电缆数量N和需求的电缆条数K,以及每根电缆的长度。输出是满足需求的最大电缆长度,精确到小数点后两位。测试用例展示了一种情况及其解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

某地区即将举行区域程序设计比赛,竞赛委员会已经成立并决定举行一次最公平的竞赛, 他们决定利用星形拓扑结构来连接每个竞赛者的电脑—也即连接这些电脑到一个中心HUB上 为了达到真正的公平竞赛目的,竞赛委员会主任下令要求:每个竞赛电脑连接到中心HUB的 电缆必须是一样长的。竞赛委员会联系了一个本地的电缆老板,要求老板为他们提供一定量 的相同长度的电缆,而且要求电缆长度越长越好。通过调查,电缆老板知道仓库中每根电缆 的长度(精确到厘米),而且他可以以厘米的精度剪断电缆,但确不知道他能为竞赛委员会 提供的每根电缆的最大长度是多少? 你的任务就是:编程求出每根电缆的最大可能的长度。

要求:采用分治法求解。

输入:

第1行,2个整数N和K,N是仓库中的电缆条数,K是竞赛委员会要求的电缆条数。 其中 1 < N < 10000, 1 < K < 10000 第2至第N+1行,每行为仓库中的一条电缆的长度,单位为米。

输出:

仅1行,为提供给竞赛委员的电缆最大长度(精确到小数点两位)

测试用例:

输入: 4 11 8.02 7.43 4.57 5.39

输出: 2.00

分析:
1.求得理想最长分割长度=总电缆长度/要求电缆条数
2.search(最短长度,待定最长长度)
3.mid为最短与最长的平均,s为平均情况下分割得到的电缆数。当s=k&&right-left<0.01,找到最大长度为mid。否则若s<k,mid偏大,s>=k,mid可能偏小。

#include<stdio.h>
double num,a[100010]={0};
int n,k;
void find(double left,double right)
{
	int i,j,s=0;
	double mid=(left+right)/2.0;//mid为最小与最大长度的平均 
	for(i=0;i<n;i++) s+=a[i]/mid;//mid下分割出的电缆数 
	if(right-left<0.0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值