Hdu 1432-Lining Up

连续下了几天雨,心烦,头痛,这样一道题目居然连思路都没有,还是看别人博客做出来的。
原因有二,我不熟悉c++map容器,我静不下心。
题意:2D平面上N个点,坐标都是整数,问最多有多少个点能落在同一条直线上。最直接的做法是O(N^3),直接枚举任意两点组成的直线,再统计跟它们共线的点。 但这个题目N<700,那么N^3=700*700*700=3.43*10^8,在TL为1S的题目面前是行不通的。 因为共线的点它们两两的斜率肯定相等,所以我们可以选择一个点作为参考点,枚举其它点,统计出现的斜率的最多次数就OK了。 这里可以用个map

#include<iostream>
#include<cstdio>
#include<map>
#include<algorithm>
using namespace std;
const int N=705;
map<double,int> MP;
map<int,int> X;
double x[N],y[N];
int ans,cnt;
double tmp;
int main()
{
    int n;
    while(cin>>n)
    {
        X.clear();
        ans=0;
        tmp=0;
        for(int i=0;i<n;i++)
        {
            cnt=0;
            MP.clear();
            cin>>x[i]>>y[i];
            ans=max(ans,++X[x[i]]);
            for(int j=0;j<i;j++)
            {
                if(x[i]==x[j]) continue;
                tmp=(y[i]-y[j])/(x[i]-x[j]);
                cnt=max(cnt,++MP[tmp]);
            }
            ans=max(ans,cnt+1);
        }
        cout<<ans<<endl;
    }
    return 0;
}

你可能感兴趣的:(Hdu 1432-Lining Up)