• 【同一直线最多点】 poj 1118+2606+2780


    poj 1118

    #include<iostream>
    using namespace std;
    #define N 700
    struct point {int x,y;} pnt[N];
    int main()
    {
        int n,i,j,k,max,cnt;
        while(scanf("%d",&n)&&n)
        {
            for(i=0;i<n;i++)
            scanf("%d%d",&pnt[i].x,&pnt[i].y);
            max=0;
            for(i=0;i<n;i++)
            for(j=i+1;j<n;j++)
            {
                cnt=0;
                for(k=j+1;k<n;k++)
                {
                    if(k==i||k==j) continue;
                    int left=(pnt[i].x-pnt[k].x)*(pnt[j].y-pnt[k].y);
                    int right=(pnt[j].x-pnt[k].x)*(pnt[i].y-pnt[k].y);
                    if(left==right) cnt++;
                }
                max=max>cnt? max:cnt;
            } 
            printf("%d
    ",max+2);
        }
        return 0;
    }

    poj 2606

    #include <iostream>
    #include <cstdio>
    #include <memory.h>
    using namespace std;
    const int maxn=202;
    struct point
    {
        int x;
        int y;
    } pnt[maxn];
    int main()
    {
        //freopen("in.txt","r",stdin);
        int n,max,cnt;
        while(cin >> n)
        {
            memset(pnt,0,sizeof(pnt));
            for(int i=0;i<n;i++)
            {
                scanf("%d%d",&pnt[i].x,&pnt[i].y);
            }
            max=0;
            for(int i=0;i<n;i++)
            {
                for(int j=i+1;j<n;j++)
                {
                    cnt=0;
                    for(int k=j+1;k<n;k++)
                    {
                        if(k==i || k==j)continue;
                        int left=(pnt[i].x-pnt[k].x)*(pnt[j].y-pnt[k].y);
                        int right=(pnt[j].x-pnt[k].x)*(pnt[i].y-pnt[k].y);
                        if(left==right)cnt++;
                    }
                     if(cnt>max)max=cnt;
                }
            }
            cout << max+2 << endl;
        }
        return 0;
    }
     
     

    poj 2780

    此题数据量比较大,同时虽然给的是3000ms,用n3算法也会超时,时间卡的紧,故一定要用n2lgn算法:

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    using namespace std;
    const int maxn = 1002;
    const double eps = 1e-6;
    struct point
    {
        int x,y;
    }node[maxn];
    double k[maxn];
    int n;
    bool equal(double x,double y)
    {
        if(abs(x-y) <= eps)
        {
            return true;
        }
        return false;
    }
    int max(int a,int b)
    {
        return a > b ? a : b;
    }
    void read()
    {
        for(int i=0;i<n;i++)
        {
            scanf("%d %d",&node[i].x,&node[i].y);
        }
        return;
    }
    void solve()
    {
        int ans = 0;
        for(int i=0;i<n-1;i++)
        {
            int top = 0;
            int tmp = 0;
            for(int j=i+1;j<n;j++)
            {
                if(node[i].x == node[j].x)
                {
                    tmp++;
                }
                else
                {
                    k[top++] = (double)(node[j].y - node[i].y) / (node[j].x - node[i].x);
                }
            }
            sort(k,k+top);
            int cnt = 1;
            for(int j=0;j<top;j++)
            {
                if(j < top-1 && equal(k[j],k[j+1]))
                {
                    cnt++;
                }
                else
                {
                    tmp = max(tmp , cnt);
                    cnt = 1;
                }
            }
            ans = max(ans , tmp);
        }
        printf("%d
    ",ans+1);
        return;
    }
    int main()
    {
        while(~scanf("%d",&n))
        {
            read();
            solve();
        }
        return 0;
    }

    注意对于每个点,都要求出当前对于此点的无斜率情况和最大斜率的数目的max

    之后枚举每个点的上述max

    之前wa了无数次,承蒙九龙大神给了一个平行四边形的测试数据才豁然开朗,同时当时对与斜率不存在的情况也没有依点而分析,造成错误在所难免,下附原来的wrong answer 代码:

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    #include <memory.h>
    using namespace std;
    const int maxn=1002;
    double s[500000+500];
    struct location_
    {
        int x;
        int y;
    }l[maxn];
    double slope(int m,int n)
    {
        double ans=(double)(l[m].y-l[n].y)/(double)(l[m].x-l[n].x);
        return ans;
    }
    int main()
    {
        //freopen("in.txt","r",stdin);
        int n;
        while(cin >> n)
        {
            memset(l,0,sizeof(l));
            memset(s,0.0,sizeof(s));
            int k=-1;
            int slo_cnt=0;
            for(int i=1;i<=n;i++)
            {
                scanf("%d%d",&l[i].x,&l[i].y);
            }
            for(int i=1;i<=n-1;i++)
            {
                for(int j=i+1;j<=n;j++)
                {
                    if((l[i].x!=l[j].x))
                    {
                        k++;
                        s[k]=slope(i,j);
                    }
                    else
                    slo_cnt++;
                }
            }
            for(int i=2;i<=10000;i++)
            {
                if(i*(i-1)/2==slo_cnt)
                {
                    slo_cnt=i;
                    break;
                }
            }
    //        cout << slo_cnt << ">>"<< endl;
    //        for(int i=0;i<=k-1;i++)
    //        {
    //            cout << i << ' ' <<s[i] << endl;
    //        }
            sort(s,s+k);
    //        for(int i=0;i<=k-1;i++)
    //        {
    //            cout << i << ' ' <<s[i] << endl;
    //        }
            int cnt=0;
            int max=0;
            for(int i=1;i<=k-1;i++)
            {
                if(fabs(s[i]-s[i-1])<=0.00000001)
                {
                    cnt++;
                    if(max<cnt)max=cnt;
                }
                else cnt=0;
            }
            max++;
    //        cout << "dsdsdsds"<< "   " <<max << endl;
            for(int i=2;i<=10000;i++)
            {
                if(i*(i-1)/2==max)
                {
                    max=i;
                    break;
                }
            }
    //        cout  << max<<"   max  " << endl;
    //        cout << slo_cnt << " slo_cnt "<<endl;
            if(slo_cnt>max)max=slo_cnt;
            cout << max << endl;
        }
        return 0;
    }
  • 相关阅读:
    修改flex应用默认的装载界面 (转载)
    Map Tile 切图小工具 (转载)
    Virtual Earth Tile Image URI 参数解析(收集,学习VE插件必看)
    WorldWind学习系列十五:如何切割影像和DEM数据及其在WW中的应用配置
    ArcGIS Server建立缓存(切图)原理解析[图解] (转载)
    自制户外登山地图傻瓜书(转载)
    WorldWind学习系列十二:Measure插件学习
    MySQL备份
    aptitude包管理工具
    MySQL的Limit查询
  • 原文地址:https://www.cnblogs.com/balfish/p/4015119.html
Copyright © 2020-2023  润新知