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;
}
本文探讨了一种利用递推算法进行预处理的技巧,通过分析点与点之间的距离关联,实现了快速计算任意两点间距离的功能。该方法适用于询问次数较多的情况,通过对递推过程的优化,将空间复杂度控制在合理范围内。
&spm=1001.2101.3001.5002&articleId=102465926&d=1&t=3&u=2f03f70a8b0b49889e621f6c9603e978)
3737

被折叠的 条评论
为什么被折叠?



