二分算法入门题--POJ - 1905 和POJ - 3104
今天又重新回顾二分算法,觉着这两个题目的思路很好。附上一下。 poj-1905 几何+二分 链接: https://vjudge.net/problem/POJ-1905 题目大意 当长度为L的细杆被加热n度时,它扩展到一个新的长度L‘=(1+n*C)*L,其中C是热膨胀系数。当一根细杆安装在两个实心壁上,然后加热时,它就膨胀成一个圆形!!!的节段,原来的杆是节段的弦。你的任务是计算杆中心移位的距离。 每行输入包含三个非负数:杆的初始长度(毫米)、温度变化(以度计)和材料的热膨胀系数。输入数据保证任何杆都不会膨胀超过其原始长度的一半。最后一行输入包含三个负数,不应该进行处理。 然后输出该木棍的中心位移 解题思路: 集合画出来是酱紫的: 由上面那个图,可以得出如下关系: R^2=(R-h)^2+L^2/4; LL(弧长)=2*R*θ; R*sin(θ)=1/2*L; 由上面三个式子可以推出: R=(4*h^2+L^2)/(8*h); LL=2*R*arcsin(L/(2*R)); 又因为,0<=R<=L/2, h=R*(1-cos(θ)); 所以 0<=h<=L/2, 利用二分枚举h,通过LL来进行更新。具体看代码。 #include<iostream>//二分枚举h(高度) #include<cstdio> #include<algorithm> #include<cmath>