没接触过计算几何的题目,昨晚见到这个题就列出了一个等式,但就是解不出来,后来听别人说二分刀痕长度,才想到这其实就是个解方程,利用二分法来枚举出l来。刀痕长度l越大面积比越小,这样就说明是可以用二分的。
题目1551:切蛋糕
#include <cstdio>
#include <cmath>
#include <cstdlib>
const double PI =acos(-1);
double rate,thita,sa,sb,ss,sleft,sright;
double low,high,l,r;
int main(){
while(scanf("%lf %lf",&r,&rate)!=EOF){
ss = PI*r*r;
low = 0.0000001,high = 2*r;
while(low<=high){
l = (low+high)/2;
thita = asin(l/2/r);
sa = r*r*thita;//扇形面积
sb = r*r/2.0*sin(2*thita);//三角形面积
sleft = sa-sb;//黄色部分的面积
sright = ss - sleft;//绿色部分的面积
if(sleft>=sright*rate){
high = l-0.00001;
}else{
low = l+0.00001;
}
}
printf("%0.2f\n",l);
}
return 0;
}
这个题目主要是用来学习的,以前从没有接触过计算几何的问题,此题解就作为学习记录之用。
这个题目中犯的错误主要是:1.精度问题 2.类型转换问题
刚开始r用整数接受,但是在计算sb的时候2.0写成2导致精度损失,使得case1,case2老过不去,后来改成2.0发现case 2过去了,但case 1还是过不去,请教他人才知道是PI的值精度取小了,把精度改为acos(-1),提交AC了,所以又专门去学习了一下精度控制的东东 http://blog.csdn.net/iaccepted/article/details/20911007