题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6354

题目:

题意:用一堆圆来切割一个圆心为原点,半径为R的圆A,问切割完毕后圆A外围剩余部分的周长(图中的红线部分)。

思路:首先判定圆与圆A的关系,这题我们只需要与A内切、相交的圆。然后就是求每个圆把圆A切割掉多少周长,增加了多少周长(因为圆A被切割的部分在切割后绝对是内凹的,此时周长是增加的),内切的时候直接加上切割圆的周长(如最上面的那个小圆),相交的圆部分我采用的方法是用余弦定理(A的半径记为R,切割圆半径为r,二者的圆心距离为d,圆心的连线与 圆A和一个交点的夹角为a,则2*d*R*cosa=R*R+d*d-r*r)求出夹角a,再用弧长公式l=a*r求出弧长最后进行加减即可。

代码实现如下:

 1 #include <set>
 2 #include <map>
 3 #include <queue>
 4 #include <stack>
 5 #include <cmath>
 6 #include <bitset>
 7 #include <cstdio>
 8 #include <string>
 9 #include <vector>
10 #include <cstdlib>
11 #include <cstring>
12 #include <iostream>
13 #include <algorithm>
14 using namespace std;
15
16 typedef long long ll;
17 typedef pair<ll, ll> pll;
18 typedef pair<ll, int> pli;
19 typedef pair<int, ll> pil;;
20 typedef pair<int, int> pii;
21 typedef unsigned long long ull;
22
23 #define lson i<<1
24 #define rson i<<1|1
25 #define bug printf("*********\n");
26 #define FIN freopen("D://code//in.txt", "r", stdin);
27 #define debug(x) cout<<"["<<x<<"]" <<endl;
28 #define IO ios::sync_with_stdio(false),cin.tie(0);
29
30 const double eps = 1e-8;
31 const int mod = 10007;
32 const int maxn = 1e6 + 7;
33 const double pi = acos(-1);
34 const int inf = 0x3f3f3f3f;
35 const ll INF = 0x3f3f3f3f3f3f3f;
36
37 typedef struct stu {
38     double x,y;
39 } point;
40
41 double Distance(point a,point b) {
42     return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
43 }
44
45 double Inter(point a,double R,point b,double r) { //变化的周长
46     double dis=Distance(a,b);
47     double angle1=acos((R*R+dis*dis-r*r)/(2.0*R*dis));
48     double angle2=acos((r*r+dis*dis-R*R)/(2.0*r*dis));
49     double s=r*angle2*2-R*angle1*2;
50     return s;
51 }
52
53 int t, m, R;
54 double x, y, r, ans;
55 stu o, p;
56
57 int main() {
58     //FIN;
59     scanf("%d", &t);
60     while(t--) {
61         scanf("%d%d", &m, &R);
62         ans = 2 * pi * R;
63         o.x = 0, o.y = 0;
64         for(int i = 1; i <= m; i++) {
65             scanf("%lf%lf%lf", &x, &y, &r);
66             p.x = x, p.y = y;
67             double d = Distance(o, p);
68             if(d - R - r >= eps) continue; //外离
69             if(fabs(R - r) - d > eps) continue; //内离
70             if(R == r + d) { //内切
71                 ans += 2 * pi * r;
72             } else { //相交
73                 ans += Inter(o, R, p, r);
74             }
75         }
76         printf("%.12f\n", ans);
77     }
78     return 0;
79 }

转载于:https://www.cnblogs.com/Dillonh/p/9433714.html

Everything Has Changed(HDU6354+圆交+求周长)相关推荐

  1. java类求圆的面积周长_java编程 1. 设计一个求圆的面积和周长的类,要求:1计算当半径r,JAVA编程题。编写一个应用程序计算圆的周长和面积,设圆的半...

    问题标题 java编程 1. 设计一个求圆的面积和周长的类,要求:1计算当半径r,JAVA编程题.编写一个应用程序计算圆的周长和面积,设圆的半 2019-5-23来自ip:15.196.194.53的 ...

  2. (1)定义圆Circle类,包含radius半径属性,求面积方法,求周长方法,返返回圆对象的详细信息的方法(2)在测试类中创建长度为5的Circle[]数组,用来装5个圆对象

    import java.util.Random;class Circle{double radius;double area;double perimeter;// 面积public void ger ...

  3. java设计求圆的面积周长的代码_java编程 1.设计一个求圆的面积和周长的类,要求:1计算当半径r=10和20时,圆的面积,并显示出来 、...

    导航:网站首页 > java编程 1.设计一个求圆的面积和周长的类,要求:1计算当半径r=10和20时,圆的面积,并显示出来 . 时间:2018-11-8 java编程 1.设计一个求圆的面积和 ...

  4. python:掌握类的基本方法。定义一个Circle类,根据圆的半径求周长和面积。 再由Circle类创建2个圆对象,其半径分别为5和10,要求输出各自的周长和面积

    掌握类的基本方法.定义一个Circle类,根据圆的半径求周长和面积. 再由Circle类创建2个圆对象,其半径分别为5和10,要求输出各自的周长和面积 请在[python数据分析之禅]gzh后台,回复 ...

  5. python 面向对象程序设计 1.2 编写程序,定义一个Circle类,根据圆的半径求周长和面积。

    题目: 编写程序,定义一个Circle类,根据圆的半径求周长和面积.再由Circle类创建两个圆对象,其半径分别为5和10,要求输出各自的周长和面积. 代码: from cmath import pi ...

  6. Python之构造函数的练习(定义一“圆”(Circle)类,圆心为“点”Point类,构造一圆,求圆的周长和面积,并判断某点与圆的关系)

    需求1:定义一"圆"(Circle)类,圆心为"点"Point类,构造一圆,求圆的周长和面积,并判断某点与圆的关系 分析: Circle: 特征:圆心,半径 行 ...

  7. **python入门实战**-已知圆的半径求周长面积

    python入门实战-已知圆的半径求周长面积 输入半径计算圆的周长和面积 这边的知识点:调用math库里面的π值,以及数据类型. 下面展示一些 代码. import math p=math.pi a= ...

  8. uva 11978 Fukushima Nuclear Blast (二分+多边形与圆交)

    二分+多边形与圆交就可以了 1 //#include<bits/stdc++.h> 2 #include<iostream> 3 #include<cstdio> ...

  9. 设计一个抽象类图形类,在该类中包含有至少两个抽象方法求周长和求面积,分别定义圆形类、长方形类、正方形类、三角形类来继承图形类,并实现上述两个方法

    设计一个抽象类图形类,在该类中包含有至少两个抽象方法求周长和求面积,分别定义圆形类.长方形类.正方形类.三角形类来继承图形类,并实现上述两个方法 设计抽象类 就要使用abstract关键字,抽象类中的 ...

最新文章

  1. 定点数的编码表示方法
  2. ORACLE 绑定变量用法总结
  3. java 停止for_java线程for循环没有循环完成就停止了,这是为什么?
  4. 程序员:工作3年了,为啥越来越不值钱……
  5. mysql explain和profiling
  6. Sep 12.1.4112.4156部署客户端
  7. Linux man C++ 库函数
  8. python乱码大赛_FishC工作室《零基础学python》全套课后题.doc
  9. 猪圈密码 摩斯密码 QWE加密 栅栏加密 当铺密码
  10. 用 JS 点击左右按钮 使图片切换 - 最精简版-ljx2380000-ChinaUnix博客
  11. c语言如何编写对数程序,在C语言中使用对数函数的方法
  12. 最新官方水晶报表实例 - 报表,应用程序
  13. 传智播客java就业班入学测试题(自测+答案)
  14. 一分钟,制作一个centos镜像
  15. 产品持续优化的六个思考点
  16. android播放蓝光播放器,安卓播放器真的拥有完美的蓝光原盘菜单导航吗?我来测试下...
  17. 中国开源年会报名 | StarRocks 极速湖仓分析的探索与实践
  18. 双十二选哪个品牌led灯好一点?国产led灯这些品牌护眼好
  19. (Aleppo + HAIST + SVU + Private) CPC 2022
  20. Mac安装Mysql踩坑记录

热门文章

  1. java 运行环境变量_java 环境变量配置与第一个程序运行
  2. 图片流写出 并带数据_第九章 IO流
  3. 【Error】Provider com.sun.xml.stream.ZephyrParserFactory not found
  4. 在linux+nginx+mysql+php环境下安装 phpmyadmin
  5. intranet的计算机环境包括,计算机四级考试网络工程师考点:企业网与Intranet
  6. 数学奥赛用不用计算机,报考自招必看!五大学科竞赛利弊详解,到底哪科最适合你?...
  7. java如何跳出循环6,Java循环结结构
  8. c语言判断一个分数是不是最简分数_青岛版六年级数学上册7.2小数、分数和百分数的互化微课视频 | 练习...
  9. java 调用本地接口_JAVA通过本地接口调用C++
  10. cmw500综合测试仪使用_高端示波器是德MSOX4154A示波器-产品使用操作说明书【二手示波器吧】...