hdu 4643 (分治+递归)

点击打开链接


题意:

给你n个城市的坐标,和m个基站的坐标,然后有t条路,给你起点和终点,求从起点到终点的过程中基站变化多少次,注意每次都选取最近的点作为基站。


题解说是什么什么图,其实啊按照代码来看就是一个分治加递归



#include"stdio.h"
#include"string.h"
#include"math.h"
#define N 51

struct node
{
	double x,y;
}A[N],B[N];

int n,m;

double dis(node a,node b)
{
	return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}

int min(node x)
{
	int i,j;
	double ans=0;
	j=1;ans=1<<30;
	for(i=1;i<=m;i++)
	{
		double t;
		t=dis(x,B[i]);
		if(ans>t)
		{
			ans=t;j=i;
		}
	}
	return j;
}


int fun(node x,node y)
{
	int a,b;
	a=min(x);
	b=min(y);
	if(a==b)return 0;
	if(sqrt(dis(x,y))<1e-7)return 1;
	node t;
	t.x=(x.x+y.x)/2.0;
	t.y=(x.y+y.y)/2.0;
	return fun(x,t)+fun(t,y);
}

int main()
{
	int i;
	int a,b;
	while(scanf("%d%d",&n,&m)!=-1)
	{
		for(i=1;i<=n;i++)
			scanf("%lf%lf",&A[i].x,&A[i].y);
		for(i=1;i<=m;i++)
			scanf("%lf%lf",&B[i].x,&B[i].y);
		scanf("%d",&i);
		while(i--)
		{
			scanf("%d%d",&a,&b);
			printf("%d\n",fun(A[a],A[b]));
		}
	}
	return 0;
}


你可能感兴趣的:(dp,HDU,多校联赛5,分治+递归)