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;
    }
    
  • 相关阅读:
    HDOJ 4747 Mex
    HDU 1203 I NEED A OFFER!
    HDU 2616 Kill the monster
    HDU 3496 Watch The Movie
    Codeforces 347A A. Difference Row
    Codeforces 347B B. Fixed Points
    Codeforces 372B B. Hungry Sequence
    HDU 1476 Sudoku Killer
    HDU 1987 How many ways
    HDU 2564 词组缩写
  • 原文地址:https://www.cnblogs.com/Spare-No-Effort/p/13790333.html
Copyright © 2011-2022 走看看