二分贪心--06

来源:互联网 发布:微创拔牙多少钱 知乎 编辑:程序博客网 时间:2024/05/18 08:36

题目大概:

给出n根长度不同的木棒,让我们切成长度相同的m根木棒,问切的木棒的最长长度是多少。

思路:

每根木棒的长度和根数成反比。

长度 l =0,,r为木棒总长度除m。mid=(l+r)/2.。

用二分法不断逼近最大的长度即可。

最后取右端点。

代码:

#include <iostream>#include <cmath>#include <cstdio>#include <algorithm>using namespace std; double l,r=0,mid;double sum=0; double a[100600];int main(){int n,m,j=0;scanf("%d%d",&n,&m);for(int i=0;i<n;i++){scanf("%lf",&a[i]);sum+=a[i];}sum=sum/(double)(m);l=0;r=sum;while(r-l>1e-10){mid=(l+r)/2;j=0;   for(int i=0;i<n;i++)   {j+=(int)(a[i]/mid);   }   if(j>=m){l=mid;}   else r=mid;}printf("%.2f\n",r=(int)(r*100)/100.0);  return 0;}

0 0
原创粉丝点击