码迷,mamicode.com
首页 > 其他好文 > 详细

Wannafly挑战赛25 B 面积并 数学

时间:2018-09-30 14:55:26      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:++   names   挑战   输出   name   答案   半径   efi   namespace   

题面

题意:有一个正n边形,它的外接圆的圆心位于原点,半径为l .以原点为圆心,r为半径作一个圆,求圆和这个正n边形的面积并。3<=n<=1e8  1<=l<=1e6 0<=r<=1e6

题解: r>=l  时 显然是大圆面积

         r<=h 时 h是正n边形,每个小等腰三角形的高,h=l*cos(pi/n),(结合n边形的边长和正弦公式推下就可以了),答案显然是正n边形 (S=l*sin(pi/n)*h   *n,也就是每个小的等腰三角形面积 *n)

         不然图形就是正n边形每段冒出来一个小圆弧围成的面积,这个面积就用扇形面积-那块三角形的面积就可以了

         另注意n是1e8 l,r是1e6 n*l*r可以有1e20了 加上小数位,double 已经要不够了

         记得用 long double 和%LF输出 而不是%lf

 1 #include <bits/stdc++.h>
 2 #define ld long double
 3 using namespace std;
 4 long double S,al,s,h,n,l,r,pi=acos(-1);
 5 int main()
 6 {
 7     cin>>n>>l>>r;
 8     if (r>=l) 
 9     {
10         printf("%.2Lf",pi*r*r);    
11         return 0;
12     }
13     h=l*cos(pi/n);
14     S=l*sin(pi/n)*h;
15     if (r<=h) printf("%.2Lf",S*n);
16     else
17     { 
18         al=acos(h/r); 
19         s=al*r*r-r*h*sin(al);
20         printf("%.2Lf",(S+s)*n);
21     }
22 }

 

Wannafly挑战赛25 B 面积并 数学

标签:++   names   挑战   输出   name   答案   半径   efi   namespace   

原文地址:https://www.cnblogs.com/qywhy/p/9728871.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!