zoukankan      html  css  js  c++  java
  • hdu6398 计算几何

    不算严格的计算几何,就是各种分类
    精度调好就能过,考虑三条边斜着放的所有情况即可

    #include<bits/stdc++.h>
    #define LL long long
    #define ll long long
    #define fi first
    #define se second
    #define mk make_pair
    #define pi acos(-1)
    #define PII pair<int, int>
    #define y1 skldjfskldjg
    #define y2 skldfjsklejg
    #define g(ans) printf("%.12f
    ",ans)
    #define bug puts("####")
    
    using namespace std;
    
    const double eps=1e-6;
    const int N = 2e5 + 7;
    const int M = 1e7 + 7;
    const int inf = 0x3f3f3f3f;
    const LL INF = 0x3f3f3f3f3f3f3f3f;
    const int mod = 1e9 +7;
    
    double a,b,c,w,ans;
    double getang(double a,double b,double c)
    {
        return acos((b*b+c*c-a*a)/(2.0*c*b));
    }
    void cal()
    {
        double ang2=getang(c,a,b);
        double ang1=getang(b,a,c);
        double ang3=getang(a,b,c);
    //    printf("%.12f %.12f %.12f
    ",a,b,c);
        if(ang1<=pi/2+eps&&ang2<=pi/2+eps&&a<=w+eps)ans=min(ans,sin(ang1)*c);
    
        if(ang1+eps>=pi/2&&c*cos(pi-ang1)+a<=w+eps)ans=min(ans,c*sin(pi-ang1));
        double ang4=asin(w/b);
        if(ang4+eps>=ang3&&pi/2-ang4+eps>=ang2)ans=min(ans,b*cos(ang4));
        double ang5=asin(w/a)+ang1-pi/2;
        if(ang5+eps>=0&&ang5<=pi/2+eps&&a>w+eps&&asin(w/a)+eps>=ang2)
            ans=min(ans,sin(ang5)*c+a*cos(asin(w/a)));
    
        if(ang2+eps>=pi/2&&b*cos(pi-ang2)+a<=w+eps)ans=min(ans,b*sin(pi-ang2));
        ang4=asin(w/c);
        if(ang4+eps>=ang3&&pi/2-ang4+eps>=ang1)ans=min(ans,c*cos(ang4));
        ang5=asin(w/a)+ang2-pi/2;
        if(ang5+eps>=0&&ang5<=pi/2+eps&&a>w+eps&&asin(w/a)+eps>=ang1)
            ans=min(ans,sin(ang5)*b+a*cos(asin(w/a)));
    }
    void solve()
    {
        double d[10];
        for(int i=0;i<6;i++)scanf("%lf",&d[i]);
        scanf("%lf",&w);
        a=sqrt((d[0]-d[2])*(d[0]-d[2])+(d[1]-d[3])*(d[1]-d[3]));
        b=sqrt((d[0]-d[4])*(d[0]-d[4])+(d[1]-d[5])*(d[1]-d[5]));
        c=sqrt((d[4]-d[2])*(d[4]-d[2])+(d[5]-d[3])*(d[5]-d[3]));
        ans=1e18;
        cal();
        swap(a,b);swap(b,c);cal();
        swap(a,b);swap(b,c);cal();
        if(ans>=1e18)puts("impossible");
        else printf("%.12lf
    ",ans);
    }
    int main()
    {
    //    freopen("b.in","r",stdin);
    //    freopen("b.out","w",stdout);
        int T;scanf("%d",&T);
        while(T--)solve();
        return 0;
    }
    /**********************
    1
    2 4 0 2 7 4 4
    6.08
    **********************/
    
  • 相关阅读:
    BZOJ 2038 小Z的袜子 莫队算法
    POJ 3407 球面距离
    POJ 1375 圆的切线
    BZOJ 1502 月下柠檬树 simpson积分
    UVA 11704
    POJ 1981 定长圆覆盖最多点
    HDU 3982 半平面交+圆和凸多边形面积并
    ZOJ 1104 二分
    使用Singleton来实现Flash和Flex的通信。
    校内API相关
  • 原文地址:https://www.cnblogs.com/acjiumeng/p/9490189.html
Copyright © 2011-2022 走看看