Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
前面讨论的数据都过了,还是WA。。。。。(附思路及代码)我用的是最原始的算法,复杂度有n^3,但是时间不是问题,还是很宽裕的。主要问题是WA……多case考虑了,横的竖的斜的平行的都测过了,小数的精度也似乎没有问题…… @,@ 大概思路就是算出某一个点跟其它各个点之间的斜率,也就是通过这个点的所有直线的斜率,然后看有多少个斜率是相同的。如此循环算出每个点…… #include <iostream.h> #include <stdio.h> void main() { int n; int i,j; int XY[1000][2]; //存放各个点的xy坐标 double k[1000][2]; //k[i][0]存放斜率,k[i][1]存放这个斜率值的个数 int kp,kmax=0; //kp是k的下标,kmax表示k中有效值的个数,即有多少个不同的斜率值 double ktemp; //暂时存放斜率 int maxL=2; //就是我们要求出来的东西啦~ while (cin>>n) { for (i=0;i<n;i++) //输入一个case里的X、Y { scanf("%d %d",&XY[i][0],&XY[i][1]); } for(i=0;i<n;i++) { for(j=i+1;j<n;j++) //求第i个点与第j个点的斜率 { if(XY[i][0]==XY[j][0]) { ktemp=1001; //X值相等,同一条竖线上,1001表示无穷大 } else { ktemp=(double)(XY[i][1]-XY[j][1])/(XY[i][0]-XY[j][0]); } for(kp=0;kp<kmax;kp++) { if(k[kp][0]==ktemp) //如果k中已有相同的斜率值 { k[kp][1]++; if(k[kp][1]>maxL) { maxL=k[kp][1]; } break; } } if(kp==kmax) //如果k中没有相同的斜率值 { k[kp][0]=ktemp; k[kp][1]=2; kmax++; } } kmax=0; //第i个点与其它点斜率算完,将k的有效值置为0,准备第i+1个点 } printf("%d\n",maxL); maxL=2; //准备下一个case } } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator