POJ1064

http://poj.org/problem?id=1064

题意:知道N段电缆的长度,从他们中切割出K条长度相同的电缆,求最大可以切多长,答案保留2位小数。

二分搜索。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cmath>
using namespace std;
const int maxn=1e5+10;
const int INF = 1e9;
int n,k;
double a[maxn];
//判断是否满足条件
bool cmp(double x)
{
    int num=0;
    for(int i=1;i<=n;i++){
        num+=(int)(a[i]/x);
    }
    return num>=k;
}
int main()
{
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++){
        scanf("%lf",&a[i]);
    }
    double lb=0,ub=INF;//初始化解的范围
    //重复循环,知道解的范围足够小,循环100次,基本上没有什么精度问题了。
    for(int i=0;i<100;i++)
    {
        double mid=(lb+ub)/2;
        if(cmp(mid)) lb=mid;
        else ub=mid;
    }
    printf("%.2f",floor(ub*100)/100);//floor函数是向下取整函数
}

你可能感兴趣的:(搜索)