第一次排位賽 I. Farm
阿新 • • 發佈:2022-03-08
第一次排位賽 I. Farm
一道數學二維幾何問題,少用高中的方程思維,多用一些math庫裡的東西,像反三角函式這樣,直接計算出角度值進而計算就可。
記得 保留小數位數
#include<bits/stdc++.h> using namespace std; signed main() { int t; cin>>t; int k=0; double s1,s2; while(t--) { k++; double xc,yc,r; double xb,yb,xu,yu; cin>>xc>>yc>>r; cin>>xb>>yb>>xu>>yu; cout<<"Case "<<k<<": "; //先為左頂點設上未知數 double x0=xb,y0=yu; //計算 double deta_y=sqrt(r*r-(x0-xc)*(x0-xc)); double deta_x=sqrt(r*r-(y0-yc)*(y0-yc)); //計算相交的兩個點的橫縱座標 double y=yc-deta_y; double x=xc+deta_x; //應該是 {x0,y}和{x,y0} //寫出一個三角形的面積 s1=(y0-y)*(x-x0)/2.0; double x3=x0-xc; double y3=y-yc; double x4=x-xc; double y4=y0-yc; //寫出圓上弦和半徑構成的三角形的面積 s2=(x3*y4-x4*y3)/2.0; // cout<<"s2:"<<s2<<endl; //用反三角函式計算出角度值 後面用扇形面積公式得出結果 double sta=acos((x3*x4+y3*y4)/(sqrt(x3*x3+y3*y3)*sqrt(x4*x4+y4*y4))); //列印的時候記得 小數點保留位數 printf("%.5llf\n",s1+1/2.0*sta*r*r-s2); } }