继续复习
暴力
给出n个点的坐标,选出最多的点,在一条直线上
直接暴力,不过时间比较糟糕。一个二重循环,枚举i,j两个点,这两点确定一条直线,然后枚举剩下的点看是否在这条直线上,所以一个三重循环,时间复杂度O(n^3)
注意枚举不要做重复的工作,否则会超时
另外这题是有O(n^2logn)的算法的
#include#include #include #include using namespace std;#define N 710#define LEN 110int n;struct point{ int x,y;}p[N];typedef struct point point;int line(int i ,int j ,int k){ return (p[j].y-p[i].y)*(p[k].x-p[i].x) - (p[j].x-p[i].x)*(p[k].y-p[i].y);}void solve(){ int max = 2; for(int i=0; i max) max = res; } printf("%d\n",max);}int main(){ int T; scanf("%d",&T); getchar(); getchar(); while(T--) { char str[LEN]; n = 0; while(1) { if(!gets(str)) break; if(!strcmp(str,"")) break; sscanf(str,"%d%d",&p[n].x , &p[n].y); n++; } solve(); if(T) printf("\n"); } return 0;}