zoukankan      html  css  js  c++  java
  • #正余弦定理#牛客练习赛71 B 烙印

    题目

    将三角形的六要素只留下三个已知条件,
    问有多少种情况,多组询问


    分析

    首先分类讨论一下(对新高一不友好,比如说我)。
    前置知识:

    1. 正弦定理:

    [frac{a}{sinA}=frac{b}{sinB}=frac{c}{sinC}=2r(外接圆的直径) ]

    正弦定理的话应该可以通过做高或者外接圆证明,详见百度百科

    1. 大边对大角,可以通过上面的正弦定理意会一下,三角形内角越大,
      那么它所对应的(sin)值越大,根据正弦定理可以知道它的对边也会越大,反过来显然
    2. 余弦定理:

    [cosA=frac{b^2+c^2-a^2}{2bc}\ cosB=frac{a^2+c^2-b^2}{2ac}\ cosC=frac{a^2+b^2-c^2}{2ab} ]

    此证明详见百度百科,新高一什么都不会呢

    然后具体分成如下四种情况,

    1. 只知道三条边:两边之和均大于第三边为1,否则为0
    2. 只知道三个角:三角形内角和是180度即无限种(相似三角形),否则为0
    3. 只知道两个角,一条边:如果现在知道的两个角的和不小于180度为0,
      否则为1,因为三个角都能求出来,且知道一条边,可以通过大边对大角证明
    4. 只知道一个角,两条边:
      (1). 如果这个角是夹角只有一种情况,根据余弦定理可以将第三条边求出来,
      并且转换成第一个问题,显然计算后两边之和均会大于第三边
      (2). 如果这个角不是夹角,那又要分类讨论:
      如果已知角是直角或者钝角根据大边对大角
      可以知道当已知角的对边长度不超过另一条边无解,因为三角形内角等于180度
      否则答案为1
      如果已知角是锐角,设已知的角为(angle A),它所对的边为(a),并且另一条已知边为(b)
      首先可以根据正弦定理算出(sinB),显然它是一个正数,由于(sinB)的值域应为((0,1])
      超过值域无解,(sinB=1)(直角)只有一种情况,然后根据大边对大角,
      如果(a>=b)只有一种情况,否则有两种情况(一个锐角一个钝角)
      由于C++精度存在一定误差所以还要设置(eps)

    代码

    #include <cstdio>
    #include <cctype>
    #include <cmath>
    #define rr register
    using namespace std;
    const double pi=acos(-1.0);
    const double eps=1e-8;
    inline signed iut(){
        rr int ans=0,f=1; rr char c=getchar();
        while (!isdigit(c)) f=(c=='-')?-f:f,c=getchar();
        while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
        return ans*f;
    }
    inline void doit1(int a,int b,int A){
        rr double sinB=b*sin(A*pi/180)/a;
        if (A>=90){
            printf("%d
    ",a>b);
            return;
        }else{
            if (sinB-1>eps) printf("0
    ");
            else if (fabs(sinB-1)<eps) printf("1
    ");
                else if (a>=b) printf("1
    ");
                    else printf("2
    ");
            return;
        }
    }
    signed main(){
        for (rr int T=iut();T;--T){
            rr int a=iut(),b=iut(),c=iut(),A=iut(),B=iut(),C=iut();
            if ((~a)&&(~b)&&(~c)){
                if (a+b<=c||b+c<=a||a+c<=b) printf("0
    ");
                    else printf("1
    ");
                continue;
            }
            if ((~A)&&(~B)&&(~C)){
                if (A+B+C!=180) printf("0
    ");
                    else printf("syksykCCC
    ");
                continue;
            }
            if (a*b*c<0){
                if ((A>0&&b*c>0)||(B>0&&a*c>0)||(C>0&&b*a>0)) printf("1
    ");
                else if (B>0&&b*c>0) doit1(b,c,B);
                else if (C>0&&b*c>0) doit1(c,b,C);
                else if (A>0&&a*b>0) doit1(a,b,A);
                else if (B>0&&a*b>0) doit1(b,a,B);
                else if (A>0&&a*c>0) doit1(a,c,A);
                else if (C>0&&a*c>0) doit1(c,a,C);
                continue;
            }
            if (A*B*C<0){
                if (B+C>=180||A+B>=180||A+C>=180) printf("0
    ");
                    else printf("1
    ");
                continue;
            }
        }
        return 0;
    }
    
  • 相关阅读:
    android-----JNI学习 helloworld
    android布局之线性布局
    Hadoop最基本的wordcount(统计词频)
    有些错误就只因没有全局观
    Eclipse如何生成带有自定tag的Java Doc
    编程之美----高效率地安排见面会----贪心策略
    Servlet Filter
    【解决方法】VS 丢失模板
    你不是一个人在战斗——软件项目团队模型
    [Oracle] Data Pump 详细使用教程(4)- network_link
  • 原文地址:https://www.cnblogs.com/Spare-No-Effort/p/13790333.html
Copyright © 2011-2022 走看看