http://poj.org/problem?id=1064
【题目大意】
给出几条绳子的长度,问如果要切出k条长度相等的绳子,这k条绳子最常多长?
【思路】
二分。把下界设为0,上界设为所有绳子长度总和,每次取mid,判断如果每条绳子长为mid切出条数是否≥k,满足则将下边界设为mid,否则把上边界设为mid。因为是要保留小数的,所以通过循环来进行精确。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<cmath> 6 using namespace std; 7 const int MAXN=10000+500; 8 int n,k; 9 double len[MAXN]; 10 double sum; 11 12 int whether(double x) 13 { 14 int num=0; 15 for (int i=0;i<n;i++) 16 { 17 num+=(int)(len[i]/x); 18 } 19 return num>=k; 20 } 21 22 int main() 23 { 24 scanf("%d%d",&n,&k); 25 for (int i=0;i<n;i++) 26 { 27 scanf("%lf",&len[i]); 28 sum+=len[i]; 29 } 30 double lb=0,ub=sum; 31 for (int i=0;i<100;i++) 32 { 33 double mid=(lb+ub)/2; 34 if (whether(mid)) lb=mid; 35 else ub=mid; 36 } 37 printf("%.2lf\n",floor(ub*100)/100); 38 return 0; 39 }
时间: 2024-10-06 10:40:19