标签:
二分.
条件C(x)=可以得到k条长度为x的绳子,求满足C(x)的x的最小值.求解这样的最大化或最小化问题:"假定一个解并判断是否可行".(普通二分查找值的条件C(x)=v).
注意:
1.关于精度,这个貌似不太好估算,所以就循环100次咯.
1 #include<cstdio> 2 #include<algorithm> 3 using std :: max; 4 5 const int maxn=10005; 6 int n,k; 7 double maxl,l[maxn]; 8 9 bool judge(double x) 10 { 11 int sum=0; 12 for(int i=1;i<=n;i++) 13 { 14 sum+=(int)(l[i]/x); 15 } 16 return sum>=k; 17 } 18 19 double bsearch(double x,double y) 20 { 21 for(int i=0;i<300;i++) 22 { 23 double m=x+(y-x)/2; 24 if(judge(m)) x=m; 25 else y=m; 26 } 27 return x; 28 } 29 30 void init() 31 { 32 scanf("%d%d",&n,&k); 33 for(int i=1;i<=n;i++) 34 { 35 scanf("%lf",&l[i]); 36 maxl=max(maxl,l[i]); 37 } 38 } 39 40 void solve() 41 { 42 printf("%.2f\n",floor(bsearch(0,maxl)*100)/100); 43 } 44 45 int main() 46 { 47 freopen("Cable.in","r",stdin); 48 freopen("Cable.out","w",stdout); 49 init(); 50 solve(); 51 fclose(stdin); 52 fclose(stdout); 53 return 0; 54 }
标签:
原文地址:http://www.cnblogs.com/Sunnie69/p/5423183.html