题目描述
有 N 条绳子,它们的长度分别为Li。如果从它们中切割出 K 条长度相同的绳子,这 K 条绳子每条最长能有多长?答案保留到小数点后 2 位(直接舍掉 2 位后的小数)。
输入格式
第一行两个整数 N 和 K,接下来 N 行,描述了每条绳子的长度 Li 。
输出格式
切割后每条绳子的最大长度。答案与标准答案误差不超过0.01 或者相对误差不超过 1% 即可通过。
题目的思路很简单,就是一个不断二分的过程,对于二分不太熟悉的同学可以移步二分模板题(8条消息) 二分查找(数的范围)_diao____si的博客-CSDN博客_二分查找范围
这题的主要是注意一些细节,一个是对于保留小数的问题,我们可以先把所有的数据先*100,计算结束后把结果再/100即可,另一个细节是题目的数据比较大,记得数组和数据都开longlong避免出错。
#include<iostream>
#include<cstdio>
using namespace std;
#define N 20000
long long length[N];
long long n,k;
long long l=0;
bool check(int x)
{
int ans=0;
for(int i=0;i<n;i++)
{
ans+=length[i]/x;
}
return ans>=k;
}//构造函数用来判断当前二分的长度是否能够切除题目要求的段数
int main()
{
cin>>n>>k;
double x;
for(int i=0;i<n;i++){
scanf("%lf",&x);
length[i]=x*100;//每一条绳子长度都先×一百
l+=length[i];
}
long long s=0,e=l;
while(s<e)
{
long long mid=(1+s+e)/2;
if(mid==0)break;
if(check(mid))
s=mid;
else
e=mid-1;
}
printf("%.2lf",s*1.00/100);//结果除以一百后约分
return 0;
}
该博客讨论了一道编程题目,涉及到绳子切割成相同长度段的问题。题目要求找到能切割出至少K段的最长绳子长度,答案需要保留两位小数。博主分享了使用二分查找算法解决此问题的思路,并提醒注意数据类型和精度处理。在实现过程中,博主建议先将所有长度乘以100以处理小数,然后进行二分查找,最后除以100得到答案。博客强调了二分查找的细节和处理大数据时的数据类型选择。
&spm=1001.2101.3001.5002&articleId=126201854&d=1&t=3&u=b89b35e134a047b2a31fb002ce7ef7a9)
1083

被折叠的 条评论
为什么被折叠?



