洛谷P1142 轰炸 数学

洛谷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 }

 

posted @ 2017-05-26 10:28  third2333  阅读(238)  评论(0编辑  收藏  举报