code forces 407A Triangle

本文介绍了Code Forces 407A题目的详细解析,该题要求根据三角形的两条直角边,在平面上找到整点构成的三角形,且避免边平行于坐标轴。通过暴力枚举方法,确定一个点为(0,0),然后在第一和第二象限放置其余两点,检查所有坐标是否为整数并避免平行边。在解决问题的过程中,作者遇到了精度问题和样例错误,最终通过调整解决了这些问题。" 81564856,7385329,理解Prim算法构建最小生成树,"['图论', '算法', '数据结构']
摘要由CSDN通过智能技术生成

code forces   407A    Triangle                题目链接:http://codeforces.com/problemset/problem/407/A

题目大意:给出三角形的两条直角边,求能否在平面上放置这样一个三角形,使得三角形的三个顶点都是整点,且没有平行于坐标轴的边。

题目分析:题目不难,数据不大,暴力即可。先定一点(0,0)另外两点在x轴上方,既然不能平行,那么两条边都是斜的,所以一个点在第一象限,另一个在第二象限。两个点分别向x轴做垂线,又构成了两个三角形。通过枚举其中一个小三角形的一条边得到图上其它所有值,如果所有值都是整数,且没有出现平行于坐标轴的边,结果就出现了。


code:

#include<stdio.h>
#include<math.h>
int main()
{
    int i,j,n,a,b;
    double ii,nn;
    bool flag;
    scanf("%d%d",&a,&b);
    flag=false;
    for(i=1;i<a;i++)
    {
        j=a*a-i*i;
        n=(int)sqrt(j*1.0);
        //printf("i==%d  n==%d  j==%d\n",i,n,j);
        if(n*n==j)
        {
            ii=(double)b*1.0/(double)a*i;
            nn=(double)b*1.0/(double)a*n;
            //if(a==765&&b==408)
            //printf("entered  ii2==%f,nn2==%f,fabs(ii2+nn2-b2)=%f\n",ii*ii,nn*nn,fabs(ii*ii+nn*nn-b*1.*b));
            if(fabs(ii*ii+nn*nn-b*b)<=1e-9&&fabs(ii-n)>=1e-9&&fabs(ii-floor(ii))<=1e-9)
            {
                flag=true;
                printf("YES\n%d %d\n",i,n);
                printf("0 0\n%.0lf %.0lf\n",-1*nn,ii);
                break;
            }
        }
    }
    if(!flag)printf("NO\n");
    return 0;
}


PS:没图实在不好说,blog期间现学了GIMP(只会画图的弱渣真心无力……)。

PSS:遇见了迄今为止最最奇葩的一件事。同一组样例,本地测试对,提交就错……幸好是CF,有样例反馈,最后还是一点一点改出来了可怜

PSSS:忘了说我遇到的坑了,我的算法由于出现了double且有除法,所以会出现丢精度的现象(虽然本地没问题),我的处理方法是<=1e-9。值得一记微笑





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值