hdu2073 无限的路

这道题吧我觉得还是有点思维量的。


思路:1.我们要求的是两点之间的距离,可以转化为点到原点的距离,然后相减。

         2.首先看这张图分为两种线:一种是有点的线【如(0,1)与(1,0)的线;(0,2)与(2,0)的线】,一种是没有点的线【如(0,1)与(0,0)的线;(0,2)与(1,0)的线,(0,3)与(2,0)的线】。

         我们先看第二种线(因为这种考虑的情况要少些):

         A.假设要求的是(0,2)到原点的距离,最近的没有点的边那就是sqrt(pow(1,2)+pow(2,2));同理假设要求得是(0,4)到原点的距离,最近的没有点的那就是sqrt(pow(3,2)+pow(4,2)); 

         B.假设要求得是(3,0),最近的没有点的边为sqrt(pow(2,2)+pow(3,2));

         C.假设要求得 是(1,2),然后发现离该点最近的没有点的边是(0,3)与(2,0)之间的连线,1+2=3,然后也就可以像上面那样子做了。

        最后看第一种带点的线:很简单的我们可以发现第一个边为sqrt(2),第二个边为2*sqrt(2),第三个边为3*sqrt(2);

假如求得是(1,2),有1+2=3,3-1条完整的有点的边,然后根据这个点的x坐标来计算最后还有几个根号2.

然后就大功告成!!!!!


#include<stdio.h>
#include<math.h>
double ll(int x,int y){
int i,n=x+y;
double s1=0,s2=0,l;
l=(double)sqrt(2);
for(i=0;i<n;i++){//计算的是没有点的边
    s1=s1+sqrt(pow(i,2)+pow(i+1,2));
}
for(i=1;i<n;i++){//计算的是有点的边(并且是该点之前的有点的 边)
  s2=s2+i*l;
}
s2=s2+x*l;
s2=s2+s1;
return s2;
}
int main(){
int n;
while(scanf("%d",&n)!=EOF){
    while(n--){
        int  x1,y1,x2,y2;
        double sum;
        scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
        sum=fabs(ll(x1,y1)-ll(x2,y2));
        printf("%.3lf\n",sum);
    }
}
return 0;
}

阅读更多

没有更多推荐了,返回首页