`

HDU 1798 Tell me the area .

阅读更多

Tell me the area

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 900    Accepted Submission(s): 284

Problem Description
    There are two circles in the plane (shown in the below picture), there is a common area between the two circles. The problem is easy that you just tell me the common area.

 

 

Input
There are many cases. In each case, there are two lines. Each line has three numbers: the coordinates (X and Y) of the centre of a circle, and the radius of the circle.
 

 

Output
For each case, you just print the common area which is rounded to three digits after the decimal point. For more details, just look at the sample.
 

 

Sample Input
0 0 2 2 2 1
 

 

Sample Output
0.108
 

 

Author
wangye
 

 

Source
 

 

Recommend
wangye
 
几何题,分三种情况讨论…………
假设圆A半径r1 < 圆B半径r2
 
d0 = 圆心距
d1 = A圆心到交线距离
d2 = B圆心到交线距离
arc1 = A圆优弧弓型面积
arc2 = B圆优弧弓型面积
 
情况一:
 
d0 >= r1 + r2
 
两圆相离或外切,area = 0.0
 
情况二:
 
d0 + r1 <= r2 
 
两圆内含或内切,area = A圆面积
 
情况三:
 
r2 - r1 < d0 < r1 + r2
 
相交有两小类:
 
1、d0 >= d1, area = arc1 + arc2
 
2、d0 < d1, area = arc1 + A圆面积 - arc2
 
下面贴上代码:
4290504 2011-07-29 21:40:46 Accepted 1798 62MS 208K 1115 B C++ 10SGetEternal{(。)(。)}!
#include <iostream>
#include <cmath>
using namespace std;
#define fp(x) ((x) * (x))
#define fmin(x, y) ((x) < (y)? (x): (y))

int main()
{
    double x1, y1, r1, x2, y2, r2;
    double A, B, C, d, d0, d1, d2, ang1, ang2, taa1, taa2, ara1, ara2, area;

    while (scanf("%lf%lf%lf%lf%lf%lf", &x1, &y1, &r1, &x2, &y2, &r2) != EOF)
    {
        if (r1 > r2)    //保证圆A半径小于圆B
        {
            swap(r1, r2);
            swap(x1, x2);
            swap(y1, y2);
        }
        A = 2 * (x2 - x1);
        B = 2 * (y2 - y1);
        C = fp(x1) - fp(x2) + fp(y1) - fp(y2) + fp(r2) - fp(r1);
        d = sqrt(fp(A) + fp(B));
        d0 = sqrt(fp(x1 - x2) + fp(y1 - y2));
        d1 = abs(A * x1 + B * y1 + C) / d;
        d2 = abs(A * x2 + B * y2 + C) / d;
        if (d0 >= r1 + r2) area = 0.0;
        else if (d0 + r1 <= r2) area = acos(-1.0) * fp(r1);
        else 
        {
            ang1 = acos(d1 / r1);
            ang2 = acos(d2 / r2);
            taa1 = r1 * d1 * sin(ang1);
            taa2 = r2 * d2 * sin(ang2);
            ara1 = ang1 * fp(r1);
            ara2 = ang2 * fp(r2);
            area = ara2 - taa2;
            if (d0 >= d2)
                area += ara1 - taa1;
            else
                area += acos(-1.0) * fp(r1) - ara1 + taa1;; 
        }
        printf("%.3lf\n", area);
    }

    return 0;
}

 注意DB错误……a - (c + d) = a - c + d

分享到:
评论

相关推荐

    hdu.rar_HDU 1089.cpp_OJ题求和_hdu_horsekw5_杭电obj

    【标题】"hdu.rar_HDU 1089.cpp_OJ题求和_hdu_horsekw5_杭电obj" 提供的信息是关于一个压缩文件,其中包含了一个名为 "HDU 1089.cpp" 的源代码文件,这个文件是为了解决杭州电子科技大学(Hangzhou Dianzi ...

    hdu5102.zip_K.

    标题中的"hdu5102.zip_K."暗示这是一个与编程竞赛相关的题目,通常在HDU(杭州电子科技大学)在线判题系统中出现。这个题目可能是一个编程挑战,要求参赛者解决一个特定的问题,并提交源代码以供自动评判。"K."可能...

    杭电操作系统实验 HDU操作系统实验.zip

    杭电操作系统实验 HDU操作系统实验.zip杭电操作系统实验 HDU操作系统实验.zip杭电操作系统实验 HDU操作系统实验.zip杭电操作系统实验 HDU操作系统实验.zip杭电操作系统实验 HDU操作系统实验.zip杭电操作系统实验 HDU...

    HDU 2000-2099 解题报告.CHM

    解题报告|ACM|程序设计参考程序以及题目的分析

    大学期间操作系统实验-HDU操作系统实验.zip

    HDU操作系统实验.zip大学期间操作系统实验-HDU操作系统实验.zip大学期间操作系统实验-HDU操作系统实验.zip大学期间操作系统实验-HDU操作系统实验.zip大学期间操作系统实验-HDU操作系统实验.zip大学期间操作系统实验-...

    HDU-GO v19.1225.2.zip

    【HDU-GO v19.1225.2.zip】是一个针对杭州电子科技大学(HDU)选课系统的浏览器插件,版本号为v19.1225.2。这个插件的主要功能是优化和提升学生在进行网络选课时的体验,它可能包含了增强界面、自动化操作、数据解析...

    HDU+2000-2099+解题报告.zip

    《杭电OnlineJudge 2000-2099解题报告》是针对杭州电子科技大学(HDU)在线评测系统(OnlineJudge)中2000至2099题目的详细解答集锦,主要涵盖了算法分析、编程技巧以及问题解决策略等内容。这份解题报告以CHM...

    HDU-2000-2099.zip_hdu2000

    【标题】"HDU-2000-2099.zip_hdu2000" 是一个包含杭电(Hangzhou Dianzi University)ACM竞赛题目解题报告的压缩包,覆盖了编号从2000到2099的题目。这个资源对于学习算法、提高编程技巧以及准备ACM/ICPC(国际大学...

    hdu_acm_1084.rar_ACM_HDU10_acm10_hdu_hdu 1084

    【标题】"hdu_acm_1084.rar_ACM_HDU10_acm10_hdu_hdu 1084" 提供的是一个关于杭电(HDU)ACM竞赛第1084题的解决方案。该题目可能是在编程竞赛中常见的算法问题,而ACM(国际大学生程序设计竞赛)是全球知名的编程...

    HDU-ACM_java.rar_hdu

    【标题】"HDU-ACM_java.rar" 是一个针对杭州电子科技大学(HDU)ACM竞赛的资源压缩包,其中包含的是使用Java语言编写的算法解决方案。这个压缩包主要面向那些参与或准备参与ACM国际大学生程序设计竞赛(ICPC)的参赛...

    ACM HDU题目分类

    ACM HDU 题目分类 ACM HDU 题目分类是指对 HDU 在线判题系统中题目的分类,总结了大约十来个分类。这些分类将有助于编程选手更好地理解和解决问题。 DP 问题 DP(Dynamic Programming,动态规划)是一种非常重要...

    HDU-2000-2099.rar_hdu

    HDU(杭州电子科技大学在线评测系统)是一个知名的编程竞赛平台,为编程爱好者提供了大量的算法题目进行练习和比赛。这个名为"HDU-2000-2099.rar_hdu"的压缩包包含了该平台从2000到2099共100道题目的源代码。这些...

    hangdianACM.rar_hangdiana_hdu acm_www.hangdianacm_杭电

    这个压缩文件包含的是作者个人提交并解决的ACM(国际大学生程序设计竞赛,International Collegiate Programming Contest)题目,这些题目来源于HDU的在线编程平台。 【描述】"杭电的一些acm题目,都是我自己一个一...

    hdu.rar_hdu

    "hdu.rar_hdu"这个压缩包文件很可能是某位程序员整理的他在HDU上解决过的题目代码集合。这些代码通常包含了对各种算法的应用,例如排序、搜索、图论、动态规划等,对于学习算法和准备编程竞赛的初学者来说是一份宝贵...

    kuangbin acm模板超级好用

    2.18.1 HDU4656 卷积取模 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 2.19 其它公式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 2.19.1 Polya . . . ....

    HDUACM2010版03递推求解.ppt

    HDUACM2010版03递推求解.ppt

    HDU_2010.rar_hdu 2010_hdu 20_hdu acm20

    【标题】"HDU_2010.rar"是一个压缩包文件,其中包含了与"HDU 2010"相关的资源,特别是针对"HDU ACM20"比赛的编程题目。"hdu 2010"和"hdu 20"可能是该比赛的不同简称或分类,而"hdu acm20"可能指的是该赛事的第20届...

Global site tag (gtag.js) - Google Analytics