分割电缆

来源:互联网 发布:淘宝旗下99 编辑:程序博客网 时间:2024/06/10 15:19

 分割电缆
2010/05/15 下午 07:31
题目

输入:第一行是两个整数N和K,用一个空格隔开,其中N (1 = N = 10000)表示电缆的条数,K (1 = K = 10000)表示最终所需要的电缆根数。在接下来的N行里分别表示N条电缆的长度,范围从1米到100公里。所有的长度都精确到厘米,即小数点后两位。

输出:每根电缆的最大长度,单位为米,精确到小数点后两位。如果不能满足要求(即每根的长度还不到1厘米),就输出0.00。

解题思路

此题明显是二分法,考虑到解题需要,一律把单位换算成厘米,最小的从1cm开始,最大的是最长的电缆长度值。然后通过二分查找来找到合适的解,条件就是left>=right的时候,并且得到的电缆数目要大于等于需要的数目。这题中唯一要注意的是精度,Robot13之所以两个保密用例没有过,估计就是这个原因。

 

a[i]=(int)100*(a[i]+1e-8);printf("%.2lf\n",(double)left/100);


把精度注意好了,此题就能AC了

 

#include<iostream>#include<cstdio>using namespace std;int main(){int n,m;double a[10002];cin>>n>>m;int max=0;for (int i=1;i<=n;i++){   cin>>a[i];   a[i]=(int)100*(a[i]+1e-8);   if(max<a[i])    max=a[i];    }int left=1;int right=max;int mid;float upset;int temp;while (left < right)    {       mid = (left + right) / 2+1;    temp=0;    for(int i=1;i<=n;i++)      temp+=(int)a[i]/mid;     if (temp < m)    right = mid-1;                                     else    left = mid ;    }       if (temp >= m)   {    printf("%.2lf\n",(double)left/100);   }      else     cout<<"0.00"<<endl;    return 0;}


 

原创粉丝点击