纠结时A一发还是很爽的
- 原题链接:Here!
- 分析:把问题分解成求两个点到初始点的距离,这两个点的距离就是差。
- 如何计算图中一个点到起始点的距离?
设直线方程为 y+x=c 可以看到图中被 橙、黄、绿标记的直线c是不同的,也就是说c可以区分不同直线。
ok,我们来算倾斜的线(棕色)的长度incline,假设求第三个倾斜的线(0,3)->(2,0),其长度为 sqrt( 3*3 + 2*2 )。
直线上的长度是一个等差数列,an=(n-1)*sqrt(2) ,( 从(0,0)开始 ),只需要把前c-1条直线的长度求和即可。
最后是求点到所在直线端点的长度,观察图可以发现点的横坐标x代表这个点是这条直线上的第几个点,所以.....
- CODE:
/* Note: 把问题分解成求两个点到初始点的距离,这两个点的距离就是差 */ #include<cstdio> #include<cmath> using namespace std; //#define test double Length(int x,int y){ // 求点(x,y)到出发点的距离 int c = x+y; double incline = 0; for(int i=1;i<=c;i++) incline += sqrt((i*i+(i-1)*(i-1))); // 计算倾斜长度 double straight = c*(c-1)/2*sqrt(2) + x*sqrt(2); return straight + incline; } int main(){ int n; #ifdef test freopen("Hdu 2073 无限的路.txt","r",stdin); #endif scanf("%d",&n); while(n--){ int x1,y1,x2,y2; scanf("%d%d%d%d",&x1,&y1,&x2,&y2); if(x1==x2 && y1==y2) printf("0.000\n"); else{ double s1=Length(x1,y1) , s2=Length(x2,y2); printf("%.3lf\n",fabs(s1-s2)); } } return 0; }