码迷,mamicode.com
首页 > 其他好文 > 详细

【计算几何】【圆反演】hdu6158 The Designer

时间:2017-08-20 10:04:57      阅读:239      评论:0      收藏:0      [点我收藏+]

标签:blog   for   ret   sig   ges   img   sign   cpp   半径   

技术分享

给你内外那俩圆的半径,让你按图中标号的顺序往缝里塞n个小圆,问你小圆的总面积。

不知道圆反演的先去查一下定义。

将两个圆的切点视作反演中心,任取反演半径(比如1),将两个圆反演成两条平行直线,则那些小圆都变成相同大小啦!就很好算了,我们再将小圆通过反演算回它原来的面积即可。

技术分享

怎样求原小圆的面积呢?

技术分享

只需求得AB的长度即可。因为A’距离原点的距离我们知道,B’距离原点的距离我们也知道,OA,OB就很好求了,作个差就是AB。

(这套CCPC网络赛的题是我们学校的人出的,线下测题的时候,我的这份代码能AC的,现在我交到hdu上就TLE了,貌似加强了数据,卡了常数……?)

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const double PI=acos(-1.0);
int R1,R2,n;
double sqr(double x){
	return x*x;
}
int T;
int main(){
	//freopen("e.in","r",stdin);
	scanf("%d",&T);
	for(;T;--T){
		scanf("%d%d%d",&R1,&R2,&n);
		if(R1>R2){
			swap(R1,R2);
		}
		double r=(1.0/2.0/(double)R1-1.0/2.0/(double)R2)*0.5;
		double X=(1.0/2.0/(double)R1+1.0/2.0/(double)R2)*0.5;
		double now=0,ans=0;
		for(int i=1;i<=n;++i){
			double t=sqrt(X*X+now*now);
			ans+=sqr((1.0/(t-r)-1.0/(t+r))*0.5)*PI;
			if(i&1){
				now+=r*2.0;
			}
		}
		printf("%.5lf\n",ans);
	}
	return 0;
}

【计算几何】【圆反演】hdu6158 The Designer

标签:blog   for   ret   sig   ges   img   sign   cpp   半径   

原文地址:http://www.cnblogs.com/autsky-jadek/p/7398531.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!