快弄死我了 最后的原因是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; }