J - Janitor Troubles 三分 海伦公式

    技术2023-06-17  89

    交题链接

    解法:

    (1) 利用三分查找两边角度,求出围成最大面积的那个角度

    此处用角度求面积方法:余弦公式   得到对角线C边长度

    再用海伦公式可分别求出两个三角形面积,然后相加为四边形面积

    #include<bits/stdc++.h> double pi=acos(-1); using namespace std; double a,b,c,d; double A,B,C,D; double S(double x,double y,double z) { double p=(x+y+z)/2; return sqrt(p*(p-x)*(p-y)*(p-z)); } double get(double x) { double cc=sqrt(a*a+b*b-2*a*b*cos(x)); double sum=0; sum+=S(a,b,cc); sum+=S(c,d,cc); return sum; } int main() { double hh[5]; scanf("%lf%lf%lf%lf",&hh[0],&hh[1],&hh[2],&hh[3]); sort(hh,hh+4); A=hh[0]; B=hh[1]; C=hh[2]; D=hh[3]; double l=0.0000001; double r=pi-l; double ans=0; a=A; b=B; c=C; d=D; while(l+0.0000001<r) { double mid=(l+r)/2; double mmid=(mid+r)/2; if(get(mid)>get(mmid)) r=mmid; else l=mid; } ans=max(ans,get(l)); a=A; b=C; c=B; d=D; l=0.0000001; r=pi-l; while(l+0.0000001<r) { double mid=(l+r)/2; double mmid=(mid+r)/2; if(get(mid)>get(mmid)) r=mmid; else l=mid; } ans=max(ans,get(l)); a=A; b=B; c=D; d=C; l=0.0000001; r=pi-l; while(l+0.0000001<r) { double mid=(l+r)/2; double mmid=(mid+r)/2; if(get(mid)>get(mmid)) r=mmid; else l=mid; } ans=max(ans,get(l)); // // printf("%lf %lf\n",l,r); printf("%.15lf\n",ans); }

    (2)暴力枚举角度【0.00001,3.14159】  取max即可

    #include<bits/stdc++.h> double pi=acos(-1); using namespace std; double a,b,c,d; double A,B,C,D; double S(double x,double y,double z) { double p=(x+y+z)/2; return sqrt(p*(p-x)*(p-y)*(p-z)); } double get(double x) { double cc=sqrt(a*a+b*b-2*a*b*cos(x)); double sum=0; sum+=S(a,b,cc); sum+=S(c,d,cc); return sum; } int main() { double hh[5]; scanf("%lf%lf%lf%lf",&hh[0],&hh[1],&hh[2],&hh[3]); sort(hh,hh+4); A=hh[0]; B=hh[1]; C=hh[2]; D=hh[3]; double l=0.0000001; double r=pi-l; double ans=0; a=A; b=B; c=C; d=D; for(double i=0.00001;i<3.14159;i+=0.00001) { ans=max(ans,get(i)); } a=A; b=C; c=B; d=D; l=0.0000001; r=pi-l; for(double i=0.00001;i<3.14159;i+=0.00001) { ans=max(ans,get(i)); } a=A; b=B; c=D; d=C; l=0.0000001; r=pi-l; for(double i=0.00001;i<3.14159;i+=0.00001) { ans=max(ans,get(i)); } printf("%.15lf\n",ans); }

     

     

    Processed: 0.012, SQL: 9