2021牛客寒假算法基础集训营1 E.三棱锥之刻
E.三棱錐之刻
P為正三棱錐內部的中心,PA,PD為正三棱錐外接球半徑,OP為正三棱錐內切球半徑
結論:已知正三棱錐的棱長為a,那么正三棱錐外接球半徑為:64a\frac{\sqrt{6}}{4}a46??a ,正三棱錐內切球半徑為:612a\frac{\sqrt{6}}{12}a126??a
//minn為正三棱錐內切球半徑,maxx為正三棱錐外接球半徑 double minn = sqrt(6.0) * a / 12, maxx = sqrt(6.0) * a / 4; double area;本題分三種情況:
(1) 當橫截面積 ≤ 是三角形的內切圓 即 橫截圓的半徑 ≤ 36a\frac{\sqrt{3}}{6}a63??a
此時OG為底面三角形ABC的內切圓,OG為內切圓的半徑為:d=36ad = \frac{\sqrt{3}}{6}ad=63??a ,染色圓的半徑為:r
那么染色球與其中一個底面三角形ABC形成的橫截圓的半徑為:r1=(r?612a)2?d2r_1 = \sqrt{(r - \frac{\sqrt{6}}{12}a)^2 - d^2}r1?=(r?126??a)2?d2?
所以:此時底面三角形ABC染色面積為:πr12πr_1^2πr12? ,有4個面就是 4πr124πr_1^24πr12?
(2) 當 正三角形的內切圓 < 橫截圓 < 正三角形的外接圓 即 染色的面積如藍色陰影部分:
 
這個面積分為兩個部分:等腰三角形+扇形
此時的 r1,d,2dr_1, d, 2dr1?,d,2d 如圖所示
3個等腰三角形面積 = r12?d2×d×3\sqrt{r_1^2-d^2} × d × 3r12??d2?×d×3
扇形的弧度:α=(2π?acos(dr1)×2×3)÷3α = (2π - acos(\fracze8trgl8bvbq{r_1} )× 2 × 3) ÷ 3α=(2π?acos(r1?d?)×2×3)÷3
3個扇形面積 = α2π×π×r12×3\frac{α}{2π} × π × r_1^2 × 32πα?×π×r12?×3
else {if (r1 <= d) {area = PI * r1 * r1;} else {double area1 = sqrt(f(r1) - f(d)) * d * 3;//3個等腰三角形的面積//cos() 是已知一個角的弧度值 x,求該角的余弦值 y;而 acos() 是已知一個角的余弦值 y,求該角的弧度值 x。//扇形面積 = ((2 * PI - 三個等腰三角形的角度) * 3 / 3) / (PI * 2) * PI * f(r1);double area2 = ((((PI * 2) - (acos(d / r1) * 2) * 3) / 3) / (PI * 2)) * PI * f(r1);area = area1 + area2; }}完整的AC代碼:
#include<cstdio> #include<iostream> #include<cstring> #include<string> #include<cmath> #include<algorithm> #define ll long long #define int ll #define PI acos(-1) #define MOD 1000000007 using namespace std; int read() {int w = 1, s = 0;char ch = getchar();while (ch < '0' || ch>'9') { if (ch == '-') w = -1; ch = getchar(); }while (ch >= '0' && ch <= '9') { s = s * 10 + ch - '0';ch = getchar(); }return s * w; } //x的平方 double f(double x) {return x * x; } signed main() {double a;//題目給的正三棱錐的棱長double r;//題目給的染色的半徑scanf("%lf%lf", &a, &r);// sqrt(6) * a / 12;是正三棱柱內切球的半徑// sqrt(6) * a / 4; 是正三棱柱外接球的半徑double minn = sqrt(6.0) * a / 12, maxx = sqrt(6.0) * a / 4;/*本題分三種情況:Ⅰ. 當染色半徑 r <= sqrt(6) * a / 12; 那么就無法染色Ⅱ. 當染色半徑 r >= sqrt(6) * a / 4; 那么整個正三棱柱的內部都會染色Ⅲ. 當染色半徑 sqrt(6) * a / 12 < r < sqrt(6) * a / 4 時分為兩個小情況:(1) 當橫截面積 恰好是三角形的內切圓(2) 當橫截面積 大于正三角形的內切圓 小于正三角形的外接圓*/double r1 = sqrt(f(r) - f(sqrt(6.0) * a / 12));//在正三棱錐的一個側面被染色截面圓的半徑double d = sqrt(3.0) / 6 * a;//正三角形的內切圓的半徑double area;if (r <= minn) area = 0;else if (r >= maxx) area = sqrt(3.0) / 4 * f(a);//正三棱錐一個側面三角形的面積else {if (r1 <= d) {area = PI * r1 * r1;} else {double area1 = sqrt(f(r1) - f(d)) * d * 3;//3個等腰三角形的面積//cos() 是已知一個角的弧度值 x,求該角的余弦值 y;而 acos() 是已知一個角的余弦值 y,求該角的弧度值 x。double area2 = 3 * ((((PI * 2) - (acos(d / r1) * 2) * 3) / 3) / (PI * 2)) * PI * f(r1);//扇形面積 = ((2 * PI - 三個等腰三角形的角度) * 3 / 3) / PI * 2 * PI * f(r1);area = area1 + area2;}}printf("%.6lf\n", area * 4);return 0; }總結
以上是生活随笔為你收集整理的2021牛客寒假算法基础集训营1 E.三棱锥之刻的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: java.sql.SQLExceptio
 - 下一篇: 计算机的艺术