poj 1118 Lining Up || poj 2780 Linearity || poj 2606 Rabbit hunt

本来1118没想起来什么方法,O(N^3)过了,去百度搜看有啥好方法没,搜到了好几道这样的题,代码一贴,改改输入,改改数组范围,居然都过了,我表示。。。无语了。。

 

一个优化方法是,枚举每个点为起点,然后求得每个点和这个点的斜率,然后对斜率排序,然后再统计。N^2*LOGN的时间复杂度,140+MS过了。

 

 

 

 

P.S.经HS童鞋说明,确实木有考虑斜率不存在的情况,优化版的代码改了下。

 

无优化版

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostream> #include <algorithm> #include <queue> #include <stack> #include <math.h> using namespace std; const int MAX = 710; struct point{ int x,y;}; point p[MAX]; int crossProduct(point a,point b,point c)//向量 ac 在 ab 的方向 { return (c.x - a.x)*(b.y - a.y) - (b.x - a.x)*(c.y - a.y); } int main() { int n; while( ~scanf("%d",&n) && n ) { for(int i=0; i<n; i++) scanf("%d %d",&p[i].x,&p[i].y); int mmax = 0; for(int i=0; i<n; i++) for(int k=i+1; k<n; k++) { int sum = 0; for(int j=k+1; j<n; j++) if( crossProduct(p[i],p[k],p[j]) == 0 ) sum++; if( sum > mmax ) mmax = sum; } printf("%d/n",mmax+2); } return 0; }

 

优化版

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostream> #include <algorithm> #include <queue> #include <stack> #include <math.h> using namespace std; const int MAX = 710; const double inf = 1e20; struct point{ int x,y;}; point p[MAX]; double kk[MAX]; double kkkk(point a,point b) { if( a.x == b.x ) return inf; return (a.y - b.y)*1.0/(a.x - b.x); } int main() { int n; while( ~scanf("%d",&n) && n ) { for(int i=0; i<n; i++) scanf("%d %d",&p[i].x,&p[i].y); int mmax = 0,cnt; for(int i=0; i<n; i++) { cnt = 0; for(int k=i+1; k<n; k++) kk[cnt++] = kkkk(p[i],p[k]); sort(kk,kk+cnt); int sum = 1; for(int k=1; k<cnt; k++) if( kk[k] == kk[k-1] ) sum++; else { mmax = sum > mmax ? sum : mmax; sum = 1; } mmax = sum > mmax ? sum : mmax; } printf("%d/n",mmax+1); } return 0; }  

你可能感兴趣的:(poj 1118 Lining Up || poj 2780 Linearity || poj 2606 Rabbit hunt)