欢迎访问https://blog.csdn.net/lxt_Lucia~~

宇宙第一小仙女\(^o^)/~~萌量爆表求带飞=≡Σ((( つ^o^)つ~ dalao们点个关注呗~~

----------------------------------------我只是一条可爱哒分界线-------------------------------------------

一、问题:

Description

Edward is a worker for Aluminum Cyclic Machinery. His work is operating mechanical arms to cut out designed models. Here is a brief introduction of his work. 
Assume the operating plane as a two-dimensional coordinate system. At first, there is a disc with center coordinates (0,0) and radius R. Then, mm mechanical arms will cut and erase everything within its area of influence simultaneously, the i-th area of which is a circle with center coordinates (xi,yi) and radius riri (i=1,2,⋯,m).  In order to obtain considerable models, it is guaranteed that every two cutting areas have no intersection and no cutting area contains the whole disc. 
Your task is to determine the perimeter of the remaining area of the disc excluding internal perimeter. 
Here is an illustration of the sample, in which the red curve is counted but the green curve is not.

Input

The first line contains one integer T, indicating the number of test cases. 
The following lines describe all the test cases. For each test case: 
The first line contains two integers mm and R. 
The ii-th line of the following mm lines contains three integers xi,yi and ri, indicating a cutting area. 
1 ≤ T ≤ 1000, 1 ≤ m ≤ 100,−1000 ≤ xi,yi ≤ 1000,1 ≤ R,ri ≤ 1000  (i=1,2,⋯,m).

Output

For each test case, print the perimeter of the remaining area in one line. Your answer is considered correct if its absolute or relative error does not exceed 1e−6. Formally, let your answer be a and the jury's answer be b. Your answer is considered correct if (|a−b|) / (max(1, |b| ) ≤ 1e−6.

Sample Input

1

4 10

6 3 5

10 -4 3

-2 -4 4

0 9 1

Sample Output

81.62198908430238475376

二、题意:

给你一个圆心在(0,0)的大圆,及其半径R,然后给出 m 个小圆的圆心坐标及半径,求该大圆删去与小圆分割部分后的外围周长(题目保证小圆不会相交,且小圆不会完全把大圆覆盖),即图示红色曲线的总长度(绿线不算)。

三、思路:

注意:

1)求的是周长,不是面积,不是面积,不是面积,不要问我怎么知道的... 周长可比面积简单多了...

2)包含在大圆内的小圆,即图示绿线,无需计算。

3)内切需计算其周长,但外切无需计算。

4)运用扇形公式时,注意计算出的角度是弧度制还是角度制。

5)圆周率 π 可用 acos ( -1 ) 表示最为准确。

6)得到的α是圆心角的一半还是等于圆心角,若为一半则需 * 2。

思路:

首先令所求 ans = 大圆周长,然后每次根据外围长变化再加减即可。

对于每个小圆,根据给出的小圆圆心坐标求出两圆圆心距 dis ,由此可得出两圆关系:

1)包含( dis < R-r ):无需计算。

2)相离( dis > R+r ):无需计算。

3)外切( dis == R+r ):无需计算。

4)内切( dis == R-r ):直接加上小圆周长。

5)相交( R-r < dis && dis < R+r ):

h 表示的是大圆圆心到弦的距离,由大圆半径和小圆半径分别和弦构成的三角形,有共用的边,据此根据勾股定理即可列出关系:R * R - h * h = r * r - ( h - dis ) * ( h - dis ),从而解出 h 。

然后用 h 和两圆半径分别计算弧度。由扇形公式得弧长 L = R * acos α ,分别计算出大圆及小圆圆心角对应的弧长,然后加上小圆圆心角对应的弧长,再减去大圆圆心角对应的弧长即可。

相交虽然有两种情况 (dis <= h 和 dis > h ),但均可采用此种计算方法。

四、代码:

#include <cstdio>
#include <algorithm>
#define pai acos(-1)
using namespace std;int main()
{int T, m;double R;scanf("%d", &T);while(T--){scanf("%d %lf", &m, &R);double ans = 2.0*pai*R;double x, y, r, dis;for(int i=0; i<=m-1; ++i){scanf("%lf %lf %lf",&x, &y, &r);dis = sqrt(x*x + y*y);if(dis == R-r)      //内切ans += 2.0*pai*r;else if(R-r < dis && dis < R+r)  //相交{double h = (R*R-r*r+dis*dis)/(dis*2.0);ans += 2.0*r*acos((dis-h)/r);ans -= 2.0*R*acos(h/R);}}printf("%.20lf\n",ans);}return 0 ;
}

------------------------------------------我也是有底线的----------------------------------------------------

欢迎访问https://blog.csdn.net/lxt_Lucia~~

宇宙第一小仙女\(^o^)/~~萌量爆表求带飞=≡Σ((( つ^o^)つ~ dalao们点个关注呗~~

Everything Has Changed ( HDU 6354 ) 简单公式相关推荐

  1. HDU 1564 简单博弈 水

    n*n棋盘,初始左上角有一个石头,每次放只能在相邻的四个位置之一,不能操作者输. 如果以初始石头编号为1作为后手,那么对于每次先手胜的情况其最后一步的四周的编号必定是奇数,且此时编号为偶数,而对于一个 ...

  2. python练习—简单公式计算

    需求: 简单公式计算: 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-25/3 + 7 /399/42998 +10 * 568/14 )) - ...

  3. HDU 6354 Everything Has Changed(余弦定理)多校题解

    题意:源点处有个圆,然后给你m个圆(保证互不相交.内含),如果源点圆和这些原相交了,就剪掉相交的部分,问你最后周长(最外面那部分的长度). 思路:分类讨论,只有内切和相交会变化周长,然后乱搞就行了.题 ...

  4. hdu 5464(简单dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5464 解题思路: 由于p很小,而ai很大,所以先把ai%p,由于ai可能有负数,所以ai=(ai%p+ ...

  5. 三个最简单公式讲完卡尔曼滤波算法

    概述 首先明确一下卡尔曼滤波的基本概念:可参考知乎诸位大神的"如何通俗易懂地描述卡尔曼滤波",这里我也稍微说明一下. 所谓卡尔曼滤波就是当你在测量一个值时,同时拥有模型估计和直接测 ...

  6. visio 模具_Visio2013 自定义模具 简单公式

    目前工作需要利用visio绘制配网单线图,并考虑开发高级功能.在此,记录一下学习历程和主要知识点.文章排版意在积累知识点,排版不好,凑合着看吧!全部知识点都是自己参考微软Visio 2013sdk和自 ...

  7. Parabola 抛物线-简单公式实现

    学习过程中发现一个简单抛物线的公式,好方便(但注意这个不是物理的重力抛物线,需要模拟物理的,请去搜索:重力加速度公式) Code IEnumerator Parabola(NavMeshAgent a ...

  8. 个人习惯养成的简单公式

    很多年轻的同事都问我,你是怎么养成自律的习惯,养成阅读的习惯,养成思考的习惯,养成加班的习惯,等等,还有很多类似的问题.对于他们来说,刚入职或者入职一两年时间而已,很难想象我一个工作六年的" ...

  9. HDU - 1237简单计算器(输出问题)

    简单计算器 HDU - 1237 题目 题解 代码 题目 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. Input 测试输入包含若干测试用例,每个测试用例占一行,每行 ...

最新文章

  1. matlab与acess连接问题
  2. python k线图 动态刷新不了_ImageButton点击之后不动态刷新页面的解决方案
  3. IdentityServer4之JWT签名(RSA加密证书)及验签
  4. Point和PointF
  5. 本地修改PHP修改文件,PHP脚本批量修改本地文件名
  6. java练手小程序_Java小程序练习
  7. window核心编程 22.3 DIPS.exe的踩坑逻辑梳理
  8. 《计算机网络》_考研复试_概念面试篇
  9. pip cmd下载速度慢解决方案
  10. 哪里可以做TEM/HRTEM/EDS/线扫/Mapping测试、EBSD测试
  11. Ubuntu 18.04安装Eclipse教程
  12. 【经典面试题】css如何画一个三角形?
  13. 保存照片和视频到相册显示
  14. Linux中的基本命令无法使用,报Command not found的错误的解决方法
  15. 鸿蒙core是什么,一文看懂HMS Core到底是什么
  16. 送书 |《Python数据分析从小白到专家》
  17. 什么是压测,为什么要进行压力测试?JMETER工具的使用
  18. 计算机视觉中头部姿态估计的研究综述
  19. 数量技术宅·安徽财经大学 线上策略分享会
  20. 用Python分析广州房地产市场

热门文章

  1. uRLLC中PDCP数据复制传输及增强研究
  2. 修复office 2007或2010安装程序找不到Proplas ww/Proplsww cab
  3. c00E170R5P3是鸿蒙系统,华为鸿蒙第一批名单
  4. 设计模式(十二)-装饰器模式(Decorator Pattern)——装饰边框与被饰物的一致性
  5. 关于亚马逊SP-API申请和亚马逊SP-API注册公共开发者的PII权限一些建议
  6. Python-pptx Presentations
  7. 2D/3D人体姿态估计 (2D/3D Human Pose Estimation)
  8. html渐变线条代码,css3线性渐变语法的详解(代码示例)
  9. Deepin Software办公
  10. 基于SpringBoot的在线答疑系统的研究与实现