现在的位置: 首页 > 综合 > 正文

编程网格:连线(Lining Up)

2014年01月13日 ⁄ 综合 ⁄ 共 2394字 ⁄ 字号 评论关闭

给平面上的n个点,找到在一条线上数量最多的。

一种方法是在n个点钟找到两个点算出斜率,然后枚举其他点,若在通一条直线上,计数器加一。效率为O(n^3).

第二种方法是对于一个点,算出所有的斜率,排序O(nlgn),两个邻近的斜率相同,计数器加一。效率为O(n^2lgn)

以下给出两种算法

朴素方法:

/*#include<iostream>
using namespace std;
#define MAX 700
struct POINT
{
	int x, y;
}point[MAX];
int main()
{
	int i, j, k;
	int n, max, temp, a, b;
	while(cin>>n)
	{
		if(n==0){break;}
		max = 0;
		for(i=0; i<n; i++)
			cin>>point[i].x>>point[i].y;
		for(i=0; i<n; i++)
		{
			for(j=i+1; j<n; j++)
			{
				temp = 0;
				a = point[j].y - point[i].y;
				b = point[j].x - point[i].x;
				for(k=j+1; k<n; k++)
					if(a * (point[k].x - point[i].x) == (point[k].y - point[i].y) * b)
						temp++;
				if(max < temp)
					max = temp;
			}
		}
		cout<<max+2;
	}
	return 0;
}

编程网格时间:

Case 0: Time = 5ms, Memory = 272kB.
Case 1: Time = 5ms, Memory = 272kB.
Case 2: Time = 5ms, Memory = 272kB.
Case 3: Time = 5ms, Memory = 272kB.
Case 4: Time = 6ms, Memory = 272kB.
Case 5: Time = 12ms, Memory = 272kB.
Case 6: Time = 31ms, Memory = 272kB.
Case 7: Time = 43ms, Memory = 272kB.
Case 8: Time = 73ms, Memory = 272kB.
Case 9: Time = 73ms, Memory = 272kB.
Case 10: Time = 80ms, Memory = 272kB.
Case 11: Time = 87ms, Memory = 272kB.
Case 12: Time = 88ms, Memory = 272kB.
Case 13: Time = 124ms, Memory = 272kB.
Case 14: Time = 158ms, Memory = 272kB.
Case 15: Time = 220ms, Memory = 272kB.
Case 16: Time = 369ms, Memory = 272kB.
Case 17: Time = 367ms, Memory = 272kB.

优化方法:

#include<iostream>
#include<algorithm>
using namespace std;
#define MAX 700
struct POINT
{
	int x, y;
}point[MAX];
int N;
double angle[MAX];
int compare(void const*p,void const *q)
{
	double *temp1=(double*)p;
	double *temp2=(double*)q;
	return (*temp1)>(*temp2)?1:-1;
};
int main()
{
	while(cin>>N)
	{
		if(N==0){break;}
		for(int i=0; i<N; i++)
			cin>>point[i].x>>point[i].y;
		int max=0;
		for(int i=0;i<N-1;i++)
		{
			int index=0;
			memset(angle,0,sizeof(double));
			for(int j=i+1;j<N;j++)
			{
				if(point[i].x==point[j].x)
				{
					angle[index++]=0;
				}
				else
				{
					angle[index++]=(double)(point[j].y-point[i].y)/(point[j].x-point[i].x);
				}
			}
			qsort(angle,index,sizeof(double),compare);
			int temp=0;
			for(int j=1;j<index;j++)
			{
				if(angle[j]==angle[j-1])
				{
					temp++;
				}
				else
				{
					if(temp>max)
					{
						max=temp;
						temp=0;
					}
				}
			}
			if(temp>max){max=temp;}
		}
		cout<<max+2<<endl;
	}
	return 0;
}

编程网格时间:

Case 0: Time = 5ms, Memory = 272kB.
Case 1: Time = 5ms, Memory = 272kB.
Case 2: Time = 6ms, Memory = 272kB.
Case 3: Time = 5ms, Memory = 272kB.
Case 4: Time = 6ms, Memory = 272kB.
Case 5: Time = 8ms, Memory = 272kB.
Case 6: Time = 14ms, Memory = 272kB.
Case 7: Time = 18ms, Memory = 272kB.
Case 8: Time = 29ms, Memory = 272kB.
Case 9: Time = 30ms, Memory = 272kB.
Case 10: Time = 32ms, Memory = 272kB.
Case 11: Time = 32ms, Memory = 272kB.
Case 12: Time = 40ms, Memory = 272kB.
Case 13: Time = 41ms, Memory = 272kB.
Case 14: Time = 52ms, Memory = 272kB.
Case 15: Time = 54ms, Memory = 272kB.
Case 16: Time = 63ms, Memory = 272kB.
Case 17: Time = 73ms, Memory = 272kB.

可以发现对于后几组数据效率有明显提高。

抱歉!评论已关闭.