POJ1118 Lining Up

快弄死我了 最后的原因是abs和fabs的区别。。。

说点收获:
1.cmp函数返回的是int,所以不要直接返回double相减的结果
2.define inf 1e9和eps 1e-9
3.在整数相除得到double时要1.0*
4.加上<cmath> ,用fabs取代abs,abs是用来整数取绝对值,应该用fabs
5.思路上,本题可从线的角度考虑转化为从点的角度考虑,这样变为N^2,然后不用hash,然后对斜率,用排序,又有logN。最后为O(N^2*logN)
6.注意边界情况
7.最后找错的时候采用了随机数数据和传说中正确的代码做比较,发现它们也还是有错,只是数据弱而已
8.下面的Discuss还是很有用的
9. GCD的思路也不错,应当会写GCD
此题做得真伤元气

#include <iostream>
#include <cmath>

using namespace std;

#define inf 1e9
#define eps 1e-9

int cmp(const void * a, const void * b)
{
	double * x = (double *) a;
	double * y = (double *) b;
	if (fabs( *x - *y) < eps) return 0 ;
	else if (*x < *y) return -1;
	else return 1;
}

int main()
{
	int count = 0;
	while (true)
	{
		int n;
		cin >> n;
		if (n == 0)
		{
			return 0;
		}
		count++;
		int max = 0;
		int* x = new int[n];
		int* y = new int[n];
		for (int i = 0; i < n; i++)
		{
			cin >> x[i];
			cin >> y[i];
		}
		if (n == 1)
		{
			max = 2;
		}
		else if (n == 2)
		{
			max = 2;
		}
		else
		{			
			for (int i = 0; i < n; i++)
			{
				double * tmp = new double[n];
				int index = 0;
				for (int j = i+1; j < n; j++)
				{
					if (x[i] == x[j]) tmp[index] = inf;
					else 
					{
						tmp[index] = 1.0 * (y[i] - y[j]) / (x[i] - x[j]);
					}
					index++;
				}
				qsort(tmp, index, sizeof (double), cmp);
				int k = 1;
				int prev = 0;
				int localMax = 2;
				while (k < index)
				{
					if (fabs(tmp[prev] - tmp[k]) < eps)
					{
						localMax++;
					}
					else
					{
						localMax = 2;
					}
					if (localMax > max) 
					{
							max = localMax;
					}
					prev = k;
					k++;
				}
			}		
		}
		cout << max << endl;
	}
	return 0;
}

  

posted @ 2013-07-07 23:34  阿牧遥  阅读(270)  评论(0编辑  收藏  举报