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;
}
上一篇: The Hamming Distance [位运算]
下一篇: 紫书 UVA 839