二分法扩展
1.计算根号2的近似值
思路:令浮点型low和high的初值分别为1和2,然后根据low和high的中点mid处ff(mid)的值与2的大小来选择子区间进行逼近。
如果ff(mid)>2,则应当在[left,mid]的范围内继续逼近,否则则在[mid,right]的范围内继续逼近。
参考代码如下:
1 | #include<stdio.h> |
2.装水问题
有一个侧面看去是半圆的储水装置,该半圆的半径为R,要求往里面装入高度为h的水,有使其在侧面看去的面积与半圆面积的比例恰好为r,如下图所示。现在给定R和r,求高度h。
思路:随着水面升高,面积比例r一定是增大的,在[0,R]之间进行二分,求出比例rr,如果rr>r,在[0,rr]的范围内,否则在[rr,R]范围内,直至rr和r的差值小于1e-5;
参考代码如下:
1 | #include <stdio.h> |
3.木棒切割问题
给出N根木棒长度已知但不一定相等, 现在希望通过切割得到长度相等的K根木棒,求长度相等的K根木棒最长是多少?
如:给3根木棒,长度为10, 24, 15,要切割得到7根长度相等的木棒, 则7根木棒的长度最长为6,其组合为16+46+2*6。
暴力解法:
1 | #include<stdio.h> |
二分解法:
1 | #include <stdio.h> |