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。值得一记