解题报告:题目大意:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2073
首先要说的是同在一条直线上的所有的点(x,y)的x+y都相等,并且这个和表示这个点在第几条直线上,所以我们可以先求出从原点到所有的直线的第一个点的距离,先打一个表,
然后到点(x,y)的距离只要在到第一个点的距离的基础上再加上一个sqrt(2.0*x*x),即(x,y)点到它所在的直线的第一个点的距离就等于从原点到(x,y)的距离,然后要求(x1,y1)到(x2,y2)的距离只要用这两个点到原点的距离只差再取绝对值就可以了。
1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 double length[500]; 5 void dabiao() { 6 length[0]=0; 7 length[1]=1; 8 for(double i=2;i<=205;++i) 9 length[(int)i]=length[(int)i-1]+sqrt(2.0)*(i-1)+sqrt(i*i+(i-1)*(i-1)); 10 } 11 int main() { 12 double x1,y1,x2,y2,l1,l2; 13 int T; 14 dabiao(); 15 while(scanf("%d",&T)!=EOF) { 16 while(T--) { 17 scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2); 18 l1=sqrt(2.0*x1*x1)+length[(int)(x1+y1)]; 19 l2=sqrt(2.0*x2*x2)+length[(int)(x2+y2)]; 20 printf("%.3lf\n",fabs(l2-l1)); 21 } 22 } 23 return 0; 24 }