【题解】切割绳子
【题目描述】
有N条绳子,它们的长度分别为Li。如果从它们中切割出K条长度相同的绳子,这K条绳子每条最长能有多长?答案保留到小数点后2位(直接舍掉2位后的小数)。
【输入描述】
第一行两个整数N和K(0<N<=10000, 0<K<=10000),接下来N行,描述了每条绳子的长度Li(0<Li<=100000.00)。
【输出描述】
切割后每条绳子的最大长度。
【样例输入】
4 11 8.02 7.43 4.57 5.39
【样例输出】
2.00
【题目分析】
先确定初始区间[left,right],显然left=0,right可取单段绳子的最大值,然后使用二分法得到mid,测试mid是大于要求的值还是小于要求的值。如果mid值可以切出k段绳子,则增大下界,使left=mid;如果mid值切不出k段绳子,则mid取大了,减小上界,使right=mid;.然后最终使left 与right无限逼近答案。注意:程序中可以使用 while ((right-left)>1e-4)作为循环控制条件。
【参考代码】
#include <bits/stdc++.h>
double a[10001];
int n,k;
int judge(double x)
{
int num = 0,i;
for (i = 0; i < n; i++)
num += (int)(a[i] / x);
return num;
}
int main()
{
int i;
double left,right,mid,max=0;
scanf("%d%d",&n,&k);
for(i=0;i<n;i++)
{
scanf("%lf",&a[i]);
if (max<a[i])
max=a[i];
}
left=0, right=max;
while ((right-left)>1e-4)
{
mid=(left+right)/2;
if(judge(mid)>=k)
left=mid;
else
right=mid;
}
printf("%.2f\n",floor(right*100)/100);
return 0;
}扫描二维码推送至手机访问。
版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。