Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

前面讨论的数据都过了,还是WA。。。。。(附思路及代码)

Posted by SCUT_swabbit at 2006-03-28 23:53:15 on Problem 2780
我用的是最原始的算法,复杂度有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:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator