poj 1064 Cable master (二分)

题目链接:http://poj.org/problem?id=1064

题目大意:给你n个绳子,现在需要切割成 k 个相同长度的绳子,精确度到1厘米。找到这k条绳子可以切割成的最大的长度。

思路:用二分的方法,来搜索可以切割的长度。

 

注意:一开始错了很多次,原因是一开始就用了double来存绳子可能切割的长度来进行二分,可能是因为double的精度问题导致最后结果运算错误,换成了int来进行运算,最后再转换为double就可以ac了

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <stack>
#include <queue>
#include <cmath>
#define ll long long
#define pi 3.1415927
#define inf 0x3f3f3f3f
using namespace std;
double cost[10005];
int lin(double mid,int n,int k)
{
    int sum=0,i;
    for(i=0;i<n;++i)
        sum+=cost[i]/mid;
    if(sum>=k)
        return 1;
    return 0;
}

int main ()
{
    int n,m,i,t,l,k,r;
    double maxs=0;
    cin>>n>>k;
    for(i=0;i<n;++i)
        scanf("%lf",&cost[i]),cost[i]*=100,maxs=max(cost[i],maxs) ; ///先将绳子长度扩大100倍,使其变为整数
    l=1;r=maxs;
    while(l<=r)
    {
        int mid=(l+r)/2;
        if( lin(mid,n,k) )
            l=mid+1;
        else
            r=mid-1;
    }
        l-=1;
        double j=l/100.0;
        printf("%.2f\n",j);

    return 0;
}

 

 

posted @ 2019-12-01 14:40  blowhail  阅读(118)  评论(0编辑  收藏  举报
Live2D