Agent J(求三个圆围成的区域面积)

A - A

Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu

Submit Status Practice LightOJ 1331

Description

Agent J is preparing to steal an antique diamond piece from a museum. As it is fully guarded and they are guarding it using high technologies, it‘s not easy to steal the piece. There are three circular laser scanners in the museum which are the main headache for Agent J. The scanners are centered in a certain position, and they keep rotating maintaining a certain radius. And they are placed such that their coverage areas touch each other as shown in the picture below:

Here R1R2 and R3 are the radii of the coverage areas of the three laser scanners. The diamond is placed in the place blue shaded region as in the picture. Now your task is to find the area of this region for Agent J, as he needs to know where he should land to steal the diamond.

Input

Input starts with an integer T (≤ 1000), denoting the number of test cases.

Each case starts with a line containing three real numbers denoting R1, R2 and R3 (0 < R1, R2, R3 ≤ 100). And no number contains more than two digits after the decimal point.

Output

For each case, print the case number and the area of the place where the diamond piece is located. Error less than 10-6 will be ignored.

Sample Input

3

1.0 1.0 1.0

2 2 2

3 3 3

Sample Output

Case 1: 0.16125448

Case 2: 0.645017923

Case 3: 1.4512903270

题解:

求三个圆围成的区域面积,注意要用acos,asin会出错,因为sin150 = 1/2, sin30 = 1/2;这样asin就出错了。。

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
template<typename T, typename T1>
T getcos(T1 a, T b, T c){
    return (b*b + c*c - a*a) / (2*b*c);
}
template<typename T>
T Angarea(T a, T b, T c){
    return 0.5 * b * c * sin(a);
}
template<typename T>
T cirarea(T a, T r){
    return 0.5 * a * r * r;
} 

int main(){
    int T;
    double r1, r2, r3;
    int kase = 0;
    scanf("%d", &T);
    while(T--){
        scanf("%lf%lf%lf", &r1, &r2, &r3);
        double cosa = getcos(r2 + r3, r1 + r2, r1 + r3);
        double cosb = getcos(r1 + r2, r2 + r3, r1 + r3);
        double cosc = getcos(r1 + r3, r1 + r2, r2 + r3);
        double a = acos(cosa);
        double b = acos(cosb);
        double c = acos(cosc);
        double ans = Angarea(a, r1 + r2, r1 + r3) - cirarea(a, r1) - cirarea(b, r3) - cirarea(c, r2);
        printf("Case %d: %lf\n", ++kase, ans);

    }
    return 0;
}
 
时间: 2024-11-05 17:20:58

Agent J(求三个圆围成的区域面积)的相关文章

[再寄小读者之数学篇](2014-10-27 两曲面围成的区域的体积与表面积)

(from M.J. Shu) 设立体 $\vSa$ 由 $x^2+y^2=2z$ 与 $z=4-\sqrt{x^2+y^2}$ 围成, 求 $\vSa$ 的体积与表面积. 解答: 该区域由旋转抛物面与圆锥面围成. 所求体积为 $$\beex \bea V&=\int_0^2 \pi \cdot 2z\rd z +\int_2^4 \pi \cdot (4-z)^2\rd z\\ &\quad\sex{x^2+y^2=2z,\quad x^2+y^2=(4-z)^2}\\&=4\p

poj3819 Coverage (求直线与圆的交占直线的百分比 )

题意:给你一条直线和若干个圆,求圆与直线相交的长度占整条直线的比例 解题思路:通过定比分点的方法求出圆与直线的交占圆的比例. 第一步:(确定投影的方向是x轴还是y轴) (1)当直线的line.s(x, y), line.e(x, y)的line.s.x与line.e.x不同一时候,这条直线能够等同于起点为line.s.x, line.e.x; (2)不满足(1)时(即line.s.x==line.e.x时),当直线的line.s(x, y), line.e(x, y)的line.s.y与line

HDU 3467 (求五个圆相交面积) Song of the Siren

还没开始写题解我就已经内牛满面了,从晚饭搞到现在,WA得我都快哭了呢 题意: 在DotA中,你现在1V5,但是你的英雄有一个半径为r的眩晕技能,已知敌方五个英雄的坐标,问能否将该技能投放到一个合适的位置,使得对面所有敌人都被眩晕,这样你就有机会能够逃脱. 分析: 对于敌方一个英雄来说,如果技能的投放位置距离他不超过r则满足要求,那么如果要眩晕所有的敌人,可行区域就是以五人为中心的半径为r的圆的相交区域. 现在问题就转化为求五个半径相同的圆的相交部分的面积,如果只有一个点则输出该点. 在求交之前,

求三个字符串的最长公共子序列LCS(A,B,C)

LCS(A,B,C)!=LCS(A,LCS(B,C)) 反例: abcd abcde abced LCS(B,C)求出来可能是abce或者abcd dp[i][j][k]表示A[0...i],B[0...j],C[0...k]的LCS 转移方程: if (a[i]==b[j]&&b[j]==c[k]) dp[i][j][k]=dp[i-1][j-1][k-1]+1; else dp[i][j][k]=max(max(dp[i][j][k], dp[i-1][j][k]), max(dp[i

围成面积

围成面积 链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1359时间限制: 1000 ms         内存限制: 65536 KB [题目描述] 编程计算由"*"号围成的下列图形的面积.面积计算方法是统计*号所围成的闭合曲线中水平线和垂直线交点的数目.如下图所示,在10*10的二维数组中,有"*"围住了15个点,因此面积为15. [输入] 10×10的图形. [输出] 输出面积. [输入样例] 0 0 0

bzoj 1043 下落的圆盘 —— 求圆心角、圆周长

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1043 求出每个圆没被覆盖的长度即可: 特判包含和相离的情况,注意判包含时 i 包含 j 和 j 包含 i 是不同的情况: 然后考虑相交,可以算出被覆盖的那段圆弧所对的圆心角,用一个 [0,2π] 的角度区间维护没被覆盖的部分: 所求的角度是对于一条"基准线"而言的,所以首先要求出圆心连线对于"基准线"的角度,因为知道两个圆心,可以利用 atan2(y,x) 求

求三个数值的中间值的宏定义

怎么用一个宏来求三个数值的中间值呢?请看: #include <stdio.h> #define MIDDLE(x,y,z) ((x)<(y)?((y)<(z)?(y):(x)<(z)?(z):(x)):((y)>(z)?(y):(x)>(z)?(z):(x))) int main(void) { printf("MIDDLE(%d,%d,%d) = %d\r\n", 1,2,3,MIDDLE(1,2,3)); printf("MID

Problem J: 求个最大值

Problem J: 求个最大值 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 871  Solved: 663[Submit][Status][Web Board] Description 定义MaxValue类,用于求一系列非零整数的最大值.其中: 1. 数据成员elements用于存储所有输入的非零整数. 2. void append(int)用于向elements中添加一个新数据. 3. int getMax()用于求出elements中的

300个人围成一个圈,从某个指定的人开始报数(1--3),凡是数到3的人退出圈子

public static void main(String[] args) { /* * 300个人围成一个圈,从某个指定的人开始报数(1--3),凡是数到3的人退出圈子, * 问最后剩下的一个是从指定位置开始计数的第几个人? */ int num[]=new int[300]; int i=0; // 数组的下标计数器 0---299 int count=0; // 退出的人数计数器 0---299 int n=1; // 数数的计数器 1---3 while(count<299){ //