Cable master POJ 1064(二分)
原题
题目分析
依题意,可以考虑二分最大长度,C(x)为能得到K条长度为x的绳子.二分长度判断方法如下,第i段绳子能切下Li/x段长度为x的绳子,统计一下能切下的绳子的数量与K比较即可.控制二分次数达到精度要求即可.
代码
1 #include <cstdio> 2 #include <cstdlib> 3 #include <iostream> 4 #include <algorithm> 5 #include <utility> 6 #include <ctime> 7 #include <cmath> 8 #include <cstring> 9 #include <string> 10 #include <stack> 11 #include <queue> 12 #include <vector> 13 #include <set> 14 #include <map> 15 16 using namespace std; 17 typedef unsigned long long ULL; 18 typedef long long LL; 19 typedef long double LB; 20 const int INF_INT=0x3f3f3f3f; 21 const LL INF_LL=0x3f3f3f3f3f3f3f3f; 22 23 int N,K; 24 double num[10000]; 25 26 bool check(double s) 27 { 28 int sum=0; 29 for(int i=0;i<N;i++) 30 sum+=num[i]/s; 31 if(sum<K) return false; 32 else return true; 33 } 34 35 int main() 36 { 37 // freopen("testdata.in","r",stdin); 38 // freopen("std.out","w",stdout); 39 cin>>N>>K; 40 for(int i=0;i<N;i++) 41 scanf("%lf",&num[i]); 42 double l=0,r=200000; 43 for(int i=0;i<100;i++) 44 { 45 double mid=(l+r)/2; 46 if(check(mid)) l=mid; 47 else r=mid; 48 } 49 printf("%.2f\n",floor(r*100)/100); 50 return 0; 51 }