题目链接:https://ac.nowcoder.com/acm/contest/51458/C alt

解决思路

我们可以,以C点的x坐标(Xc)来划分左右两段

如果符合条件出现在左边(0 -> Xc)就输出YES,

如果不存在左边那就去判断是否存在右边(Xc -> Xb)(包括中间的Xc),

如果右边符合条件就输出YES,不然就符合条件输出NO

如图(画的不好请见谅,第一次写题解) alt 先求出整个三角形的面积

ABC三角形的面积为 (1/2) * Xb * Yc

假设在左边 我们设X0 为 i 他的高为X,运用 相似三角形的原理
alt 将第一个式子带入第二个式子化简后得 alt

右边也是和左边同理

alt 将第一个式子带入第二个式子化简后得 alt

下面直接上代码

#include<bits/stdc++.h>
using namespace std;
int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        bool flag=false;//来判断是否存在
        int xb,xc,yc;
        scanf("%d%d%d",&xb,&xc,&yc);
        //左右的分界线为xc
        //如果x0在左半
        //[公式由相似三角形推出]
        for(int i=0;i<xc;i++){
            if(2*i*i == xc*xb){
                flag=true;
                break;
            }
        }
        //如果不在左半
        if(!flag){
        //如果x0在右半(包括分界线)
        for(int i=xc;i<=xb;i++){
            if((xb-xc)*xb==2*i*i){
                flag=true;
                break;
            }
        }            
        }
        if(flag)puts("YES");
        else puts("NO");

    }
    return 0;
}

如果有错,请大佬在评论补充一下