九度OJ 1551 切蛋糕 计算几何+二分

没接触过计算几何的题目,昨晚见到这个题就列出了一个等式,但就是解不出来,后来听别人说二分刀痕长度,才想到这其实就是个解方程,利用二分法来枚举出l来。刀痕长度l越大面积比越小,这样就说明是可以用二分的。


题目1551:切蛋糕

时间限制:1 秒

内存限制:128 兆

特殊判题:

提交:244

解决:76

题目描述:

有如下图半价为R的圆形蛋糕,被切一刀后(图中红色直线),分成两个部分(黄色和绿色),已知其比例为r,求刀痕长度(图中红色直线)。

输入:

输入包括多组测试数据,包括一个整数R(1<=R<=1000),和一个浮点数r(0<r<1),精确到第四位小数。

九度OJ 1551 切蛋糕 计算几何+二分_第1张图片

输出:

对于每组测试用例,输出一个浮点数,代表刀痕的长度,保留二位小数。

样例输入:
1000 0.5000
500 0.6183
样例输出:
1928.53
982.49
#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


你可能感兴趣的:(二分,计算几何)