题意是给你些笛卡尔坐标系上的格点,求最多有多少个点在一条直线上。
这题的输入很麻烦,推荐用gets后再sscanf输入,
这题还卡时间!!!只有O(n^2*logn)以下的算法能过,而且之前我用stl写也超时了,
所以这里我直接用数组排序模拟,勉强过了,真是恶心的题啊= =
#include <cstdio>
#include <algorithm>
using namespace std;
const double INF = 1e300;
int cas=1;
char str[100];
int x[1005],y[1005],n;
int xx,yy,m,cnt,ans;
double k[1005];
int main()
{
while (1)
{
n=0;
while (1)
{
gets(str);
if (str[1]=='-') break;
sscanf(str,"%d%d",&x[n],&y[n]); n++;
}
if (n==0) break;
if (n==1) ans=1;
else ans=2;
for (int i=0;i<n;i++)
{
m=0; cnt=1;
for (int j=i+1;j<n;j++)
{
xx=(x[j]-x[i]);
yy=(y[j]-y[i]);
if (xx==0) k[m++]=INF;
else k[m++]=(double)yy/xx;
}
sort(k,k+m);
for (int j=1;j<m;j++)
{
if (k[j]==k[j-1]) cnt++;
else
{
if (cnt+1>ans) ans=cnt+1;
cnt=1;
}
}
if (cnt+1>ans) ans=cnt+1;
}
printf("%d. %d\n",cas++,ans);
}
return 0;
}