HDU 6158 The Designer【计算几何+笛卡尔定理+韦达定理】

来源:互联网 发布:java导出excel表格方法 编辑:程序博客网 时间:2024/04/28 08:45

题目链接

题意:照着图一个个的摆n个小圆,求小圆的总面积。

这里写图片描述

首先很容易得到第一个圆的半径,然后用笛卡尔定理导出4个圆半径的关系。

笛卡尔定理:
若平面上四个半径为r1r2r3r4的圆两两相切于不同点,则其半径满足以下结论:
(1)若四圆两两外切,则4i=11ri=24i=11r2i
(2)若半径为r1r2r3的圆内切于半径为r4的圆中,则(1r1+1r2+1r3+1r4)2=24i=11r2i

推导出关系式后,以k4作为自变量,则这个二元一次方程的两组解分别表示k3两边的两个圆的曲率。用韦达定理维护这个值就可以了。

另外,当圆的半径小于eps的时候直接break,否则会超时。

如果觉得我讲的不清楚的话可以看看这篇博客。

这题好像还有反演圆的做法,待日后补。

#include <bits/stdc++.h>using namespace std;const double pi=acos(-1.0);const double eps=1e-8;int T;double R1,R2;int N;double ans=0;double k1,k2,k3,k4,k5;int main(){    scanf("%d",&T);    while (T--){        scanf("%lf %lf",&R1,&R2);        scanf("%d",&N);        if (R1<R2){            swap(R1,R2);        }        ans=0;        k1=-1.0/R1,k2=1.0/R2;        k3=1.0/(R1-R2);        ans+=1.0/(k3*k3);        k4=k1+k2+k3;        for (int i=2;i<=N;i++){            ans+=1.0/(k4*k4);            if ((1.0/k4)<eps)                break;            if (i<=N-1){                ans+=1.0/(k4*k4);                i++;            }            k5=2*(k1+k2+k4)-k3;            k3=k4;            k4=k5;        }        ans*=pi;        printf("%.5f\n",ans);    }}
阅读全文
0 0
原创粉丝点击