题目链接:http://poj.org/problem?id=1118
一道简单的题却超时了半天,到现在我也不知道超时在了那里,都是n^3的复杂度,把判斜率相等化成了交叉相乘相减就过了。
超时代码:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include<iostream>
2 #include<cstdio>
3 #include<cmath>
4 #include<algorithm>
5 #include<string>
6 using namespace std;
7 struct ss{
8 int x,y;
9 }a[800];
10 int main()
11 {
12 int n,i,j,ma,k,z;
13 double tt,ww;
14 while (scanf("%d",&n)&&n)
15 {
16 for (i=1;i<=n;i++)
17 {
18 scanf("%d%d",&a[i].x,&a[i].y);
19 }
20
21
22 ma=1;
23 for (i=1;i<n;i++)
24 {
25 if(ma>=n-i+1)break;
26
27 for (z=i+1;z<=n;z++)
28 {
29 if(ma>=n-z+1)break;
30 k=2;
31 tt=((a[z].y-a[i].y)*1.0/(a[z].x-a[i].x));
32
33 for (j=z+1;j<=n;j++)
34 {
35 if(ma>=(n-j+1)+k)break;
36 ww=((a[j].y-a[i].y)*1.0/(a[j].x-a[i].x));
37 if(fabs(ww-tt)<1e-9)k++;
38 }
39 if(k>ma) ma=k;
40 }
41 }
42 printf("%d\n",ma);
43 }
44 return 0;
45 }
AC代码:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include<iostream>
2 #include<cstdio>
3 #include<cmath>
4 #include<algorithm>
5 #include<queue>
6 #include<stack>
7 #include<string>
8 using namespace std;
9 struct ss{
10 int x,y;
11 }a[800];
12 int main()
13 {
14 int n,i,j,ma,k,z;
15 while (scanf("%d",&n),n)
16 {
17 for (i=1;i<=n;i++)
18 {
19 scanf("%d%d",&a[i].x,&a[i].y);
20 }
21 ma=1;
22 for (i=1;i<n;i++)
23 {
24 if(ma>=n-i+1)break;
25 for (z=i+1;z<=n;z++)
26 {
27 if(ma>=n-z+1)break;
28 k=2;
29 for (j=z+1;j<=n;j++)
30 {
31 if(ma>=(n-j+1)+k)break;
32 if((a[z].y-a[i].y)*(a[j].x-a[i].x)-(a[j].y-a[i].y)*(a[z].x-a[i].x)==0)
33 k++;
34 }
35 if(k>ma) ma=k;
36 }
37 }
38 printf("%d\n",ma);
39 }
40 return 0;
41 }