標籤:out href ima efi Fix 精度 cti coder ble
連結
[https://www.nowcoder.com/acm/contest/197/B]
分析
特殊優先考慮
首先考慮r>=l這種情況就是圓的面積了
第二就是r<=內切圓的半徑,這個直接是n多邊形的面積了
第三種就是介於上面二者之間了
關鍵就是怎麼求弓形的面積,也就是扇形面積減去三角形面積了
先求出CO和CD
後面就好辦了
注意這裡的扇形公式S扇=(夾角/360)πR2 化簡 π和360約分得到二分之一,二分之一夾角正是<DOC,這裡是關鍵
看代碼吧
對特別注意精度用long double
#include<bits/stdc++.h>using namespace std;#define pi acos(-1.0)int main() { long double n, l, r; ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n >> l >> r; long double h = l*cos(pi/n);//CO 也就是內切圓半徑 long double d = sqrt(l*l - h*h);//勾股定理求CD,底的一半 long double ans = 0.5*sin(2*pi/n)*l*l;//把正多邊形分角成n個三角形的面積 if(r >=l) ans = pi*r*r;//第一種 else if (r<=h) ans*=n;//第二種 else { long double DOC=acos(h/r); //這裡很關鍵,計算角DOC //這時候扇形面積就可以根據公式化簡了 long double dd=sqrt(r*r - h*h); ans+=DOC*r*r - dd*h;//扇形-三角形,因為dd是底的一半不用除二 ans*=n; } cout << fixed << setprecision(2) << ans << endl; return 0;}
Wannafly挑戰賽25 B.面積並