【同一直线最多点】 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\n",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\n",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;
}
时间: 2024-10-12 03:44:36

【同一直线最多点】 poj 1118+2606+2780的相关文章

POJ 1118 最多共线点

Lining Up Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 22516   Accepted: 7091 Description "How am I ever going to solve this problem?" said the pilot. Indeed, the pilot was not facing an easy task. She had to drop packages at spe

HDU 1432 Lining Up (POJ 1118)

枚举,枚举点 复杂度为n^3. 还可以枚举边的,n*n*log(n). POJ 1118 要判断0退出. #include<cstdio> #include<cstring> #include<string> #include<queue> #include<algorithm> #include<map> #include<stack> #include<iostream> #include<list&

POJ 1118与2606 (水题)

[题意简述]:两道题都是求有多少点在一条直线上. [分析]:暴力然后使用斜率相等进行求解,但要注意的是在求斜率时,避免使用除法,一律换位乘法运算,否则会RE. 以2606为例贴代码,1118只是数组的大小不一样,其他相同. //216K 0Ms #include<iostream> using namespace std; int a[205],b[205]; int main() { int t; cin>>t; int res ; int ans = 0; for(int i

Lining Up Rabbit hunt poj 1118 poj 2606 点共线问题。

思路:首先把所有点按照坐标排序,然后以每一个点为基准点,计算其他点与这个点连线的斜率,将所有斜率排序后求最多的相同的斜率数即可. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 #include <string> 7 #include <vector> 8 #

POJ 1118 Lining Up

枚举,排序. 先将所有点按双关键字排序,然后枚举线的顶点$P$,剩余的点以$P$为中心进行极角排序,可以取个$gcd$,这样一样的点就排在一起了,然后统计一下更新答案. #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include&

POJ 1118

#include<iostream> #include<set> #include<stdio.h> #include<math.h> #include<algorithm> #define MAXN 705 using namespace std; int num; double p[MAXN][2]; double a[MAXN*MAXN]; set<int> coll; set<int>::iterator pos;

计算几何专题

ACM计算几何题目推荐 一. 点,线,面,形基本关系,点积叉积的理解      POJ 2318 TOYS && POJ 2398 Toy Storage  点与线段的位置    POJ 3304 Segments  线段与直线的位置    POJ 1269 Intersecting Lines  直线位置    POJ 1556 The Doors  线段相交+最短路   POJ 2653 Pick-up sticks  线段相交    POJ 1066 Treasure Hunt  线

优质题表(机密版)

转载请注明出处:http://www.cnblogs.com/dashuzhilin/p/4556803.html 思维题: poj 1528 poj 1597 poj 2538 poj 2608 poj 2612 poj 2361 poj 2339 poj 2664 uva 10894 uva 10921   uva 10922   uva 10929 uva 10931   uva 10800   uva 10878 uva 10976   uva 10323   uva 201 poj 2

基于 HTML5 WebGL 的 3D 网络拓扑图

在数据量很大的2D 场景下,要找到具体的模型比较困难,并且只能显示出模型的的某一部分,显示也不够直观,这种时候能快速搭建出 3D 场景就有很大需求了.但是搭建 3D 应用场景又依赖于通过 3ds Max 或 Maya 的专业 3D 设计师来建模,Unity 3D 引擎做图形渲染等,这对用户来说都是挑战!不过,HT 一站式的提供了从建模到渲染,包括和 2D 组件呈现和数据融合的一站式解决方案.HT 基于 WebGL 的 3D 技术的图形组件 ht.graph3dView 组件通过对 WebGL 底