极值二分-精度问题-floor和ceil-挑战程序设计2

来源:互联网 发布:ubuntu做什么 编辑:程序博客网 时间:2024/06/11 03:54

依靠二分求最大值(二分一般都是极大值吧,就算满足条件还可以在区间内分啊分,分到一个最大的)
给定一些线段的长度,让你把他平均分成k份,问你分成最大的线段是多少,
要求后两位绝对精确,不要四舍五入。。。
wa了十几次,收获很大。
floor函数
  floor(x),有时候也写做Floor(x),其功能是“下取整”,或者说“向下舍入”,即取不大于x的最大整数
(与 “四 舍 五入”不同,下取整是直接去掉小数部分),例如:
  x=3.14,floor(x)=3
  y=9.99999,floor(y)=9
  在C语言的库函数中,floor函数的语法如下:
  #include

#include <iostream>#include <cstdio>#include <cstdlib>#include <cmath>using namespace std;/*二分有n个线段,把他们分成k份,问最大的长度。求这种方法适合*/const int maxn=100806;double a[maxn];int m,k;bool solve(double d){    int sum=0;    for(int i=0;i<m;i++)       sum+=a[i]/d;     return sum>=k;}int main(){    while(~scanf("%d%d",&m,&k))    {   for(int i=0;i<m;i++)         scanf("%lf",&a[i]);         double r=200000.0;         double l=0;         for(int i=1;i<=100;i++)         {    double mid=(r+l)/2;               if(solve(mid))                  l=mid;                else                   r=mid;         }         int res=r*100;         double  sum=double(res)*0.01;          printf("%.2lf\n",sum);          //printf("%.2f\n",floor(r*100)/100);    }    return 0;}
0 0