zoukankan      html  css  js  c++  java
  • HD-ACM算法专攻系列(15)——Quoit Design

    问题描述:

    源码:

    经典问题——最近邻问题,标准解法

    #include"iostream"
    #include"algorithm"
    #include"cmath"
    using namespace std;
    
    struct Point
    {
    	double x;
    	double y;
    };
    
    Point S[100000];//不使用全局变量可能会超内存
    
    bool cmpPointX(Point a, Point b)
    {
    	return a.x > b.x;
    }
    
    bool cmpPointY(Point a, Point b)
    {
    	return a.y > b.y;
    }
    
    double EfficientClosestPair(Point *P, Point *Q, int start, int n)
    {
    	if(n <= 3)
    	{
    		double result;
    		result = (P[start].x - P[start+1].x)*(P[start].x - P[start+1].x) + (P[start].y - P[start+1].y) * (P[start].y - P[start+1].y);
    		if(n == 3)
    		{
    			double tmp = (P[start].x - P[start+2].x)*(P[start].x - P[start+2].x) + (P[start].y - P[start+2].y) * (P[start].y - P[start+2].y);
    			if(tmp < result)result = tmp;
    			tmp = (P[start+1].x - P[start+2].x)*(P[start+1].x - P[start+2].x) + (P[start+1].y - P[start+2].y) * (P[start+1].y - P[start+2].y);
    			if(tmp < result)result = tmp;
    		}
    		return result;
    	}
    	else
    	{
    		int half = n / 2;
    		double d1 = EfficientClosestPair(P, Q, start, half);
    		double d2 = EfficientClosestPair(P, Q, start + half, n - half);
    		double d = d1 < d2 ? d1 : d2;
    		double m = P[start + half - 1].x;
    		int count = 0;
    		double tmp;
    		for(int i = start; i < start + n; i++)
    		{
    			tmp = Q[i].x - m;
    			if(tmp < 0)tmp = - tmp;
    			if(tmp < d)count++;
    		}
    		double dminsq = d;
    		if(count > 1)
    		{
    			//Point *S = new Point[count];
    			for(int i = start, j = 0; i < start + n; i++)
    			{
    				tmp = Q[i].x - m;
    				if(tmp < 0)tmp = - tmp;
    				if(tmp < d)
    				{
    					S[j].x = Q[i].x;
    					S[j].y = Q[i].y;
    					j++;
    				}
    			}
    			int k;
    			for(int i = 0; i < count - 1; i++)
    			{
    				k = i + 1;
    				while(k < count && (S[k].y - S[i].y)*(S[k].y - S[i].y) < dminsq)
    				{
    					dminsq = min((S[k].x - S[i].x)*(S[k].x - S[i].x) + (S[k].y - S[i].y)*(S[k].y - S[i].y), dminsq);
    					k++;
    				}
    			}
    		}
    		
    		return dminsq;
    		
    	}
    }
    
    int main()
    {
    	int n;
    	Point *P, *Q;
    	cout.precision(2);
    	cout.setf(ios::fixed);
    	P = new Point[100000];
    	Q = new Point[100000];
    	while(scanf("%d", &n) != EOF)
    	{
    		if(n == 0)break;
    		for(int i = 0; i < n; i++)
    		{
    			scanf("%lf %lf", &P[i].x,&P[i].y);
    			Q[i].x = P[i].x;
    			Q[i].y = P[i].y;
    		}
    		if(n <= 3)
    		{
    			cout<<sqrt(EfficientClosestPair(P, Q, 0, n)) / 2<<endl;
    		}
    		else
    		{
    			sort(P, P+n, cmpPointX);//使用qsort可能会超时
    			sort(Q, Q+n, cmpPointY);
    			cout<<sqrt(EfficientClosestPair(P, Q, 0, n)) / 2<<endl;
    		}
    	}
        return 0;
    }
    

      

  • 相关阅读:
    核函数基础一简单解释
    矩阵的基本性质 之 正规矩阵,矩阵的迹,行列式,伴随矩阵,矩阵的逆,对角矩阵,矩阵求导
    矩阵的基本性质 之 对称矩阵,Hermite矩阵,正交矩阵,酉矩阵
    矩阵的基本性质 之 矩阵加减法,数乘,乘法,转置
    机器学习实战基础(二十七):sklearn中的降维算法PCA和SVD(八)PCA对手写数字数据集的降维
    拉格朗日对偶性
    批处理符号2
    批处理符号1
    set命令
    goto命令
  • 原文地址:https://www.cnblogs.com/forcheng/p/7634885.html
Copyright © 2011-2022 走看看