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; }