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;

}

  

你可能感兴趣的:(poj)