欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Uva 270 Lining Up

程序员文章站 2024-03-19 08:25:04
...
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=206
题意:给出一些点,求这些点*线的点最多有多少个?
题解:没想到暴力枚举过了。。。直接三重循环枚举。没想到改了半天没过是因为把t++直接写到输入的数组下边里去了,然而并不知道为什么,BC提示t++不明确。。。
网上有人用O(n^2logn的复杂度解得,枚举每个点,以该点位基准,求出其他点与他的斜率,然后根据斜率排序,求出相同斜率出现的最大次数。排序O(nlogn),枚举O(n)。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAX=700+10;
typedef struct
{
	int x,y;
}Point;
Point P[MAX];
char s[100];
int main()
{
	int T;
	cin>>T;
	getchar();
	gets(s);
	while(T--)
	{
		int t=0;
		while(gets(s)&&s[0]!='\0')
		{
			sscanf(s,"%d %d",&P[t].x,&P[t].y);
			t++;
		}
		int mmax=0;
		for(int i=0;i<t;i++)
			for(int j=i+1;j<t;j++)
			{
				int sum=2;
				for(int k=j+1;k<t;k++)
				{
					int dx1=P[j].x-P[i].x;
					int dy1=P[j].y-P[i].y;
					int dx2=P[k].x-P[i].x;
					int dy2=P[k].y-P[i].y;
					if(dx1*dy2==dx2*dy1) sum++;
				}
				mmax=max(mmax,sum);
			}
		cout<<mmax<<endl;
		if(T) cout<<endl;
	}
	return 0;
}