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

提交了五十次,终于过了,

Posted by newmyl at 2008-03-08 18:29:08 on Problem 3512
    这题提交了用马甲提交了近五十次,终于过了,发个贴庆祝一下
    这题我一共用了两种方法:
    第一种思路:对A,B,C三点,若直线AB,AC斜率相同,则A、B、C三点必共线,但最终这种方法我是一直WA,估计是精度问题
    第二种思路:对A,B,C三点,求出向量AB、AC的坐标,并且对AB、AC的坐标均约分成最简形式,此时若AB、AC的坐标相同,则A、B、C三点必共线,在判断AB、AC坐标是否相同时要用到哈希
    最后直得注意的一点是,输入时记得处理负数的情况,我因为没处理WA了三十多次,
    我第一种思路的代码如下,一直WA,不知错在哪里(也许是精度问题),希望牛人给予指点:
# include <stdio.h>
# include <string.h>
double d[1001][1001];
double abs(double a)
{
	if(a<0)a=-a;
	return a;
}
void merge(double *a,int p,int q,int r)
{
	int n1,n2,i,j,k;
	double l[1001],r1[1001];
	n1=q-p+1;
	n2=r-q;
	for(i=0;i<n1;i++)
	    l[i]=a[p+i];
	for(i=0;i<n2;i++)
	    r1[i]=a[q+1+i];
	r1[n2]=l[n1]=100000011;
	i=j=0;
	for(k=p;k<=r;k++)
	{
		if(l[i]<=r1[j])
		{
			a[k]=l[i];
			i++;
		}
		else 
		{
			a[k]=r1[j];
			j++;
		}
	}
}
void mergesort(double *a,int p,int r)
{
	int q;
	if(p<r)
	{
		q=(p+r)/2;
		mergesort(a,p,q);
		mergesort(a,q+1,r);
		merge(a,p,q,r);
	}
}
int main()
{
	char a[10],b[10];
	int i,j,N=1,p[1001][2],k,n,flag,count,max;//p[i][0]表示点i的横坐标
                                                  //p[i][1]表示点i的纵坐标
	while(N++)
	{
		k=0;
		while(1)
		{
			scanf("%s",a);
			if(a[0]=='-'&&a[1]=='-')
			{
				if(flag==1)
					flag=2;
				else flag=1;
				break;
			}
			flag=0;
			scanf("%s",b);
			for(i=0,n=0;i<strlen(a);i++)
			{
				if(i==0&&a[i]=='-')continue;
				n+=10*n+a[i]-'0';
			}
			if(a[0]=='-') n=-n;
			p[k][0]=n;
			for(i=0,n=0;i<strlen(b);i++)
			{
				if(i==0&&b[i]=='-')continue;
				n+=10*n+b[i]-'0';
			}
			if(b[0]=='-') n=-n;
			p[k][1]=n;
			k++;
		}
		if(flag==2)
			break;
		for(i=0;i<k;i++)//d[i][j]表示点i、j之间直线的斜率
			for(j=0;j<k;j++)
			{
				if(i==j)
					d[i][j]=-134215321;//做"哨兵"
			    else if(p[i][0]==p[j][0])
					d[i][j]=d[j][i]=123445478;//此时斜率不存在,此斜率用特殊值表示
				else 
					d[i][j]=(p[i][1]-p[j][1])/(double)(p[i][0]-p[j][0]);
			}
		max=0;
		for(i=0;i<k;i++)
		{
			mergesort(d[i],0,k-1);//用过qsort,但一直超时
			count=1;
			for(j=1;j<=k+1;j++)//因为d[i][i]的值最小,总会出现在首位位,所以j从1开始取傎
			{
				if(abs(d[i][j]-d[i][j-1])<0.0000001)
					count++;
				else 
				{
					if(count>max)
						max=count;
					count=1;
				}
			}
		}
		printf("%d. %d\n",N-1,max+1);
	}
	return 0;
}



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