UVA - 270 Lining Up 数据优化

来源:互联网 发布:淘宝网排行榜从哪里进 编辑:程序博客网 时间:2024/05/15 21:28

题目大意:给出一系列的点,同在一条直线上的点最多有几个

解题思路:优化数据,不然会TLE,将那些遍历过的,同在一条直线上的点标记下,以免下一次遍历的时候重复有

#include<cstdio>#include<cstring>using namespace std;struct node{int x;int y;};node n[1000];int s[1000];int N;int g[1000][1000];int main(){int test;char str[1000];scanf("%d\n", &test);while(test--) {int count = 0;while(gets(str) && str[0]) {sscanf(str,"%d%d",&n[count].x, &n[count].y);count++;}int max = -1;memset(g,1,sizeof(g));if(count == 2) {printf("2\n");}else {for(int i = 0; i < count ; i++) for(int j = i + 1; j < count ; j++) {if(g[i][j]) {int cnt = 0;for(int k = 0; k < count; k++) if((n[i].x -n[k].x)*(n[i].y-n[j].y) == (n[i].x-n[j].x) * (n[i].y - n[k].y))s[cnt++] = k;if(cnt > max)max = cnt;for(int l = 0; l < cnt; l++)for(int m = l + 1; m < cnt; m++)g[s[l]][s[m]] = g[s[m]][s[l]] = 0;}}printf("%d\n",max);}if(test)printf("\n");}return 0;}

还有另一种算法,这是借鉴别人的,将每个点当成原点,然后以这一点为起点,按斜率从小到大排序,一个个去求斜率相同的点,然后再以下一个点为起点去算
0 0