OJ:https://cn.vjudge.net/problem/HDU-2073
解决:
其实递推还是比较明显的,很容易找到两个点直接的关联,能直接推出每个点距离起点的距离。
因为询问的次数可能很多,所以就直接预处理了。
注意递推出来的数字时一个三角形,所以空间要开到两百
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define MAX 200
int main()
{
double map[MAX][MAX];
int i=1,j=0;
memset(map,0.0,sizeof(map));
map[0][0] = 0.0;
map[1][0] = 1.0;
while(i<MAX && j<MAX){
if(i == 0){
i = j + 1;
j = 0;
map[i][j] = map[0][i-1] + sqrt(pow(i,2) + pow(i-1,2));
}else{
j++;
i--;
int res = i + j;
double len = sqrt(2.0*pow(res,2));
map[i][j] += map[res][0] + len * (j*1.0 / res);
}
}
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
int x,y;
double r1,r2;
scanf("%d%d",&x,&y);
r1 = map[y][x];
scanf("%d%d",&x,&y);
r2 = map[y][x];
if(r2 > r1){
printf("%.3f\n",r2-r1);
}else{
printf("%.3f\n",r1-r2);
}
}
return 0;
}