code forces 407A Triangle

来源:互联网 发布:saas java开源架构 编辑:程序博客网 时间:2024/05/17 01:31

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
原创粉丝点击