洛谷P1142 轰炸
数学
题意 给出若干个点,求解最多有几个点在同一直线上
一种做法就是枚举任意两个点,求他们的斜率然后算一下还有几个点和他们的斜率一样,
这样复杂度是 O(N^3) n<=700 讲道理是过不去的,但是数据太水,就过了
另外一种做法就是由楼上提供的,我是来提供代码的,
枚举以一个点作为原点,然后求其他点,与他的斜率,然后排序一下就行了
复杂度O(n^2logn)
1 #include <cstdio> 2 #include <cstdlib> 3 #include <cmath> 4 #include <cstring> 5 #include <algorithm> 6 #include <string> 7 #include <iomanip> 8 #include <iostream> 9 using namespace std ; 10 11 const int maxn = 709 ; 12 const double inf = 1e9 ; 13 struct node{ 14 int x,y ; 15 }; 16 node a[701] ; 17 int n,ans,sum ; 18 double x,y,dist[maxn] ; 19 20 int main() 21 { 22 scanf("%d",&n) ; 23 for(int i=1;i<=n;i++) 24 { 25 scanf("%d%d",&a[ i ].x,&a[ i ].y) ; 26 } 27 ans = min(2,n) ; 28 for(int i=1;i<=n;i++) 29 { 30 31 for(int j=1;j<=n;j++) 32 { 33 if(i==j) 34 { 35 dist[ i ] = -inf-1 ; 36 continue ; 37 } 38 if(a[i].x==a[j].x) dist[ j ] = inf ; 39 dist[ j ] = (double)(a[j].y-a[i].y) / (a[j].x-a[i].x) ; 40 } 41 sort(dist+1,dist+n+1) ; 42 sum = 0 ; 43 for(int j=1;j<=n;j++) 44 if(dist[j]!=dist[j-1]) 45 { 46 ans = max(ans,sum+1) ; 47 sum = 1 ; 48 } 49 else sum++ ; 50 ans = max(ans,sum+1) ; 51 } 52 if(n==1) ans = 1 ; 53 printf("%d",ans) ; 54 55 return 0 ; 56 }