文档章节

Everything Has Changed(HDU6354+圆交+求周长)

o
 osc_4nmshwhm
发布于 2018/08/06 21:57
字数 640
阅读 14
收藏 0

精选30+云产品,助力企业轻松上云!>>>

题目链接: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 }

 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

Linux安装redis服务器和部署

Linux安装redis和部署 第一步:下载安装包 wget http://download.redis.io/releases/redis-5.0.5.tar.gz 访问https://redis.io/download 到官网进行下载。这里下载最新的5.0.5版本. 第二步:...

osc_3ytpwpyb
5分钟前
0
0
IF函数,根据条件设定输入内容

if函数通常用于条件判断,根据判断结果执行相应命令。 1.函数解释: IF(logical_test, [value_if_true], [value_if_false]) logical_test 必需。 计算结果为 TRUE 或 FALSE 的任何值或表达式...

osc_sumf8h95
7分钟前
0
0
Pytorch自定义dataloader以及在迭代过程中返回image的name

pytorch官方给的加载数据的方式是已经定义好的dataset以及loader,如何加载自己本地的图片以及label? 形如数据格式为 image1 label1 image2 label2 ... imagen labeln 实验中我采用的数据的...

osc_l8u38961
8分钟前
0
0
灯塔

\[love\ and \ share \] 我怎么感觉变成了好东西推荐呢?算了,本来也差不多 还没写完,想到再更 有好看玩的能不能评论一下,qwq 动漫 大多是些国漫,多在\(b\)站、腾讯视频、盗版小网站能够...

osc_dc6pbw3x
9分钟前
0
0
网易首页 」 网易手机 」 正文 苹果超薄触摸显示技术专利曝光:重新定义轻薄

最近,苹果公司的新屏幕专利技术已经曝光。特别是苹果公司的新型超薄触摸技术,它可以降低显示器的结构水平,消除多余的电路,并使屏幕更薄。该专利表明,这项新技术适用于iPhone,iPad,App...

osc_opzpp18v
11分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部