poj 1118

B - Lining Up
Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

Description

"How am I ever going to solve this problem?" said the pilot.  Indeed, the pilot was not facing an easy task. She had to drop packages at specific points scattered in a dangerous area. Furthermore, the pilot could only fly over the area once in a straight line, and she had to fly over as many points as possible. All points were given by means of integer coordinates in a two-dimensional space. The pilot wanted to know the largest number of points from the given set that all lie on one line. Can you write a program that calculates this number?  Your program has to be efficient! 

Input

Input consist several case,First line of the each case is an integer N ( 1 < N < 700 ),then follow N pairs of integers. Each pair of integers is separated by one blank and ended by a new-line character. The input ended by N=0.

Output

output one integer for each input case ,representing the largest number of points that all lie on one line.

Sample Input

5
1 1
2 2
3 3
9 10
10 11
0

Sample Output

3

 
  
#include 
#include 
#define inf 9999999
using namespace std; 
struct point{
	int x;
	int y;
};
int main()
{
	int n, i, j;
	point p[710];
	double k[710];
	while(scanf("%d", &n), n)
	{
		int max = 0;
		for(i = 1;i <= n;i++)
			scanf("%d%d", &p[i].x, &p[i].y);
		
		for(i = 1;i <= n;i++)
		{
			int count = 0;
			for(j = 1;j <= n;j++)
			{
				if(i==j) continue;
				if(p[i].x==p[j].x)
					k[count++] = inf;
				else
					k[count++] = (double)(1.0 *p[j].y - p[i].y) / (p[j].x - p[i].x);	
			}
			sort(k,k+count);
			int now = 1;
			for(j = 1;j < n;j++)
			{
				if(k[j]==k[j-1])
			 		now++;
			 	else
			 	{
 					if(now > max) max = now;
 					now = 1;
 				}	
			}
		}
		printf("%d\n",max+1);	
	}
} 

你可能感兴趣的:(ACM,acm,poj)