题意:问最多多少个点可以在一个圆的边上。
思路:三点确定一个园,枚举。
可惜在scu上TLE了。。。。。。。。。。。。。。。。其他oj可以A
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #define eps 1e-6 using namespace std; int n; double x[105],y[105]; int ans; void linecross(double x1,double y1,double x2,double y2,double x3,double y3,double x4,double y4,double &x5,double &y5)//已知四个点求直线相交的点的坐标 //(这种求法包括了直线斜率不存在或为0的情况下) { double A1 = y2 - y1; double B1 = x1 - x2; double C1 = y1 * (-B1) - x1 * A1; double A2 = y4 - y3; double B2 = x3 - x4; double C2 = y3 *(-B2) - x3 * A2; x5 = (C2 * B1 - C1 * B2) / (A1 * B2 - A2 * B1); y5 = (C2 * A1 - C1 * A2) / (B1 * A2 - B2 * A1); } int coun(int a,int b,int c) { if((y[b]-y[a])*(x[c]-x[a])==(y[c]-y[a])*(x[c]-x[a]))return 2; double x1,x2,x3,x4,x5,y1,y2,y3,y4,y5; x1=(x[a]+x[b])/2; y1=(y[a]+y[b])/2; x3=(x[a]+x[c])/2; y3=(y[a]+y[c])/2; if(x[a]==x[b]) { x2=x1-1; y2=y1; } else { x2=x1+(y[a]-y[b]); y2=y1-(x[a]-x[b]); } if(x[a]==x[c]) { x4=x3-1; y4=y3; } else { x4=x3+(y[a] - y[c]); y4=y3-(x[a]-x[c]); } linecross(x1,y1,x2,y2,x3,y3,x4,y4,x5,y5); int cnt=0; for(int i=1;i<=n;i++) { //if(i==a||i==b||i==c)continue; if(abs((x[i]-x5)*(x[i]-x5)+(y[i]-y5)*(y[i]-y5)-(x[a]-x5)*(x[a]-x5)-(y[a]-y5)*(y[a]-y5))<eps)cnt++; } return cnt; } int main() { while(scanf("%d",&n)&&n) { for(int i=1;i<=n;i++) { scanf("%lf%lf",&x[i],&y[i]); } if(n==1)ans=1; else ans=2; for(int i=1;i<=n;i++) { for(int j=i+1;j<=n;j++) { for(int k=j+1;k<=n;k++) { ans=max(ans,coun(i,j,k)); } } } cout<<ans<<endl; } return 0; }