新校区布网

描述

童程学校建立新校区,需要部署网线。学校联系了当地的一个网络解决方案提供商,要求能够提供一定数量的等长网线。学校希望网线越长越好,这样选手们之间的距离可以尽可能远一些。

该公司承接了这个任务。他们知道库存中每条网线的长度(精确到厘米,是指网线长度小数点后最多只有两位数,没有第 3 位),并且只要告诉他所需的网线长度(精确到厘米,是指网线长度小数点后最多只有两位数,没有第 3 位),他们都能够完成对网线的切割工作。但是,这次,所需的网线长度并不知道,这让该公司不知所措。

你需要编写一个程序,帮助该公司确定一个最长的网线长度,并且按此长度对库存中的网线进行切割,能够得到指定数量的网线。

输入描述

第一行包含两个整数 N 和 K,以单个空格隔开。N (1≤N≤10000)是库存中的网线数,K(1≤K≤10000)是需要的网线数量。

接下来 N 行,每行一个数,为库存中每条网线的长度(单位:米)。所有网线的长度至少 1cm,至多 100km。输入中的所有长度都精确到厘米,小数点后只有两位数,即保留到小数点后两位。

输出描述

该公司能够从库存的网线中切出指定数量的网线的最长长度(单位:米)。必须精确到厘米,即保留到小数点后两位。

若无法得到长度至少为 1cm 的指定数量的网线,则必须输出" 0.00 "(不包含引号)。

样例输入 1

复制代码
4 11
8.02
7.43
4.57
5.39

样例输出 1

复制代码
2.00

提示

数据范围与提示:

1≤N≤10000,1≤K≤10000

代码:

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
int n,k,a[100001],r,l,ans,mid;
double x;
bool c(int mid){
	int s=0;
	for(int i=1;i<=n;i++){
		s+=a[i]/mid;
	}
	return s>=k;
}
int main(){
	cin>>n>>k;
	for(int i=1;i<=n;i++){
		cin>>x;
		a[i]=x*100;
		r=max(r,a[i]);
	}
	while(l<=r){
		mid=(l+r)/2;
		if(c(mid)){
			ans=mid;
			l=mid+1;
		}else{
			r=mid-1;
		}
	}
	printf("%.2lf",ans/100.0);
	return 0;
}

以上内容均为原创;欢迎参考、借鉴!

但拒绝盗版;也禁止任何人在未经本人同意的条件下用于商业用途。

作者保留法律追究责任。

相关推荐
快乐的划水a7 小时前
组合模式及优化
c++·设计模式·组合模式
星星火柴9368 小时前
关于“双指针法“的总结
数据结构·c++·笔记·学习·算法
艾莉丝努力练剑9 小时前
【洛谷刷题】用C语言和C++做一些入门题,练习洛谷IDE模式:分支机构(一)
c语言·开发语言·数据结构·c++·学习·算法
阿巴~阿巴~11 小时前
深入解析C++ STL链表(List)模拟实现
开发语言·c++·链表·stl·list
旺小仔.12 小时前
双指针和codetop复习
数据结构·c++·算法
jingfeng51412 小时前
C++ STL-string类底层实现
前端·c++·算法
郝学胜-神的一滴13 小时前
基于C++的词法分析器:使用正则表达式的实现
开发语言·c++·程序人生·正则表达式·stl
努力努力再努力wz14 小时前
【c++深入系列】:万字详解模版(下)
java·c++·redis
瓦特what?15 小时前
关于C++的#include的超超超详细讲解
java·开发语言·数据结构·c++·算法·信息可视化·数据挖掘
祁同伟.16 小时前
【C++】动态内存管理
开发语言·c++