青少年编程知识记录 codecoming

【题解】切割绳子

【题目描述】

有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;  }



(adsbygoogle = window.adsbygoogle || []).push({});

作者:亿万年的星光 分类:题解目录 浏览: