zoukankan      html  css  js  c++  java
  • 牛客暑期五几何题

    题意:在长为w高为h的矩形中放入一个边长为a,b,c的三角形,求三角形的三个顶点,精度为1e-6,(输出的顶点时任意顶点)

    思路:一个三角形中至少有两个角度是锐角,则可以将通过枚举选择一个合适的点放在原点处,还可以通过旋转三角形,让另外一个边固定在矩形的边上,可以固定在与原点相邻的边上或者是相隔的边上再通过余弦定理求出角度从而确定第三个顶点;

    出现 nan(not a number)情况:在acos中出现-1和1范围之外的数。往往是括号少加了

    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    
    using namespace std;
    const double eps=1e-6;//精度16就开到6
    struct Point
    {
        double x,y;
        Point(){}
        Point(double _x,double _y):x(_x),y(_y){}
    };
    Point p[5];
    int w,h;
    int a,b,c;
    bool seg(int  a,int b,int c,int _z,int _y,int _x)
    {
        p[_z]=Point(0,0);
        if(c<=w)
        {
            p[_y]=Point(c,0);
        }
        else
        {
            p[_y].x=w;
            p[_y].y=sqrt((c*c-w*w));
        }
        double A=acos((b*b+c*c-a*a)*1.0/(2*b*c));余弦定理,通过cmath 还没遇到会出现精度问题,使劲用cmath来求角度就行了,
        double B=atan(p[_y].y/w);
        A+=B;
       // printf("%f
    ",(b*b+c*c-a*a)*1.0/2*b*c);
        //printf("%f
    ",B);
        p[_x].y=b*sin(A);
        p[_x].x=b*cos(A);
        if(p[_x].y>(0.0-eps)&&p[_x].x>(0.0-eps)&&p[_x].x<(w+eps)&&(p[_x].y<h+eps))//避免出现-0.0情况,以及精度限制问题
       {
            printf("%.12f %.12f %.12f %.12f %.12f %.12f
    ",p[0].x , p[0].y, p[1].x, p[1].y, p[2].x, p[2].y);
            return true;
        }
        return false;
    }
    
    int main ()
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
        scanf("%d%d%d%d%d",&w,&h,&a,&b,&c);
        if(seg(b, c, a, 1,0,2))continue;//通过分函数实现枚举点,通过传递参变量实现顶点的映射
        if(seg(a, b, c, 2,1,0))continue;
        if(seg(a, c, b, 2,0,1))continue;
        if(seg(b, a, c, 1,2,0))continue;
        if(seg(c, b, a, 0,1,2))continue;
        if(seg(c, a, b, 0,2,1))continue;
        }
        return 0;
    }

    枚举的时候,key:是求解最小的求解空间。

  • 相关阅读:
    Python入门系列——第20篇
    Python入门系列——第19篇
    windows下python使用pip命令安装builtwith库时,遇到的utf-8问题的解决
    Python入门系列——第18篇
    在相同的主机上创建一个duplicate数据库
    duplicate database的时候,rman连接 auxiliary database的后状态不正确
    使用duplicate target database ... from active database复制数据库
    RHEL7
    Oracle 监听器日志文件过大导致监听异常
    TNS-01251: Cannot set trace/log directory under ADR
  • 原文地址:https://www.cnblogs.com/zwx7616/p/11287779.html
Copyright © 2011-2022 走看看