解题思路:对于每个点都计算一下,它与其他点的斜率,这样就可以判断与这个点在同一条直线的点。每个点都这样做,维护最大值就可以了。
注意斜率不存在的情况。
找相同斜率的时候用了multiset。
代码:
#include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <set> using namespace std; const int N = 705; const double esp = 1e-9; int n; char str[N]; double ki[N]; int visit[N]; multiset <double> K; struct NODE { double x, y; }node[N]; double Max (const double a, const double b) { return a > b ? a: b; } double Fabs (const double a, const double b) { if (a > b) return a - b; return b - a; } int main () { int t; int cnt; int count; scanf ("%d%*c%*c", &t); while (t--) { n = 0; while (gets(str) != NULL && str[0] != '\0') { sscanf (str, "%lf%lf", &node[n].x, &node[n].y); n++; } cnt = 0; for (int i = 0; i < n; i++) { K.clear(); count = 0; memset (visit, 0, sizeof (visit)); for (int j = 0; j < n; j++) { if (i == j) continue; if (Fabs (node[i].x, node[j].x) <= esp) { count++; continue; } else ki[j] = (node[i].y - node[j].y) / (node[i].x - node[j].x); K.insert (ki[j]); visit[j] = 1; } for (int j = 0; j < n; j++) { if (visit[j]) { cnt = Max (cnt, K.count(ki[j])); // printf ("%d\n", K.count(ki[j])); } } cnt = Max (cnt, count); } printf ("%d\n", cnt + 1); if (t) printf ("\n"); } return 0; }
uva270 - Lining Up(暴力)
时间: 2024-10-18 12:19:06