Codeforces Beta Round #1 练习
A 大水题
B 模拟题,要很小心,注意细节处理
C 给你在一个正多边形上的三个点,判断这个多边形的最小面积。
由于这个多边形最多只有100条边,可以直接枚举多边形的边数计算是否满足
判断是否满足:
三个点组成的三角形的每个角是圆周角的整数倍
判断整数的时候精度不宜太大
View Code
#include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> using namespace std; const double eps = 1e-8; const double pi = acos(-1.0); double dist(double x1,double y1,double x2,double y2){ return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); } double cross(double x1,double y1,double x2,double y2,double x3,double y3){ return (x2-x1)*(y3-y1)-(x3-x1)*(y2-y1); } bool ok(int n,double ang){ double tmp=ang*n/pi;//判断tmp是否是一个整数 double x=floor(tmp+1e-3);//精度不宜过大,这里WA了一次 if(tmp-x<1e-3) return true; return false; } int main() { double x1,x2,y1,y2,x3,y3; while(scanf("%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3)!=EOF) { double a=dist(x1,y1,x2,y2); double b=dist(x2,y2,x3,y3); double c=dist(x1,y1,x3,y3); double s=cross(x1,y1,x2,y2,x3,y3); double R=a*b*c/2/s; double C=acos((a*a+b*b-c*c)/(2*a*b)); double B=acos((a*a+c*c-b*b)/(2*a*c)); double A=acos((b*b+c*c-a*a)/(2*b*c)); // printf("%.2lf %.2lf %.2lf\n",A,B,C); int n; for(n=3;n<=100;n++) if(ok(n,A)&&ok(n,B)&&ok(n,C)) break; //printf("n=%d\n",n); double cen=2*pi/n; double ans=R*R*0.5*sin(cen)*n; printf("%lf\n",ans); } return 0; }