poj2780Linearity(多点共线)

链接

判断最多多少点在一条直线上,

可以枚举每一个点为坐标系的原点,其它点变成相应的位置,然后求得过原点及其点的斜率,排序找一下最多相同的。

 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<stdlib.h>
 6 #include<vector>
 7 #include<cmath>
 8 #include<queue>
 9 #include<set>
10 #include<map>
11 using namespace std;
12 #define N 1010
13 #define LL long long
14 #define INF 0xfffffff
15 const double eps = 1e-8;
16 const double pi = acos(-1.0);
17 const double inf = ~0u>>2;
18
19 struct point
20 {
21     int x,y;
22     point(int x=0,int y=0):x(x),y(y){}
23 }p[N];
24 double o[N];
25
26 typedef point pointt;
27 pointt operator -(point a,point b)
28 {
29     return point(a.x-b.x,a.y-b.y);
30 }
31 int dcmp(double x)
32 {
33     if(fabs(x)<eps) return x;
34     return x<0?-1:1;
35 }
36
37 int main()
38 {
39     int n,i,j;
40     while(scanf("%d",&n)!=EOF)
41     {
42         for(i = 1; i <= n; i++)
43         {
44             scanf("%d%d",&p[i].x,&p[i].y);
45         }
46         int maxz=0;
47         for(i = 1; i <= n; i++)
48         {
49             int ans = 0 ,g=0;
50             for(j = 1; j <= n ;j++)
51             {
52                 int x = p[j].x-p[i].x;
53                 int y = p[j].y-p[i].y;
54                 if(x==0)
55                 ans++;
56                 else o[g++] = y*1.0/x;
57             }
58             sort(o,o+g);
59             int num = 2;
60             for(j = 1; j < g; j++)
61             if(dcmp(o[j]-o[j-1])==0)
62             num++;
63             else
64             {ans = max(ans,num);
65                 num = 2;
66
67             }
68             ans = max(ans,num);
69             maxz = max(maxz,ans);
70         }
71         printf("%d\n",maxz);
72     }
73     return 0;
74 }

poj2780Linearity(多点共线)

时间: 2024-08-09 09:41:18

poj2780Linearity(多点共线)的相关文章

UVA 270-Lining Up(多点共线)

Lining Up Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Description  Lining Up  ``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 pa

关于多点共线问题

想了想这个问题,自己写了写,之前百度了个答案,思想基本类似 #include <vector>#include <map> class point { public:     point(int x0,int x1):x(x0),y(x1){};     ~point(){};     int getX() const {return x;}     int getY() const {return y;} private:     int x;     int y; }; int

HDOJ 4463 Outlets 最小生成树

Prim....似乎没有考虑多点共线也能A..... Outlets Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2565    Accepted Submission(s): 1182 Problem Description In China, foreign brand commodities are often much mo

poj1584 A Round Peg in a Ground Hole 判断多边形凹凸,点到线的距离【基础计算几何】

大致思路:首先对于所给的洞的点,判断是否是凸多边形,图形的输入和输出可以是顺时针或者逆时针,而且允许多点共线 Debug 了好几个小时,发现如下问题 判断三点是否共线,可用斜率公式判断 POINT point_A, point_B, point_C; if(point_A.x == point_B.x || point_B.x == point_C.x){ if(point_A.x == point_B.x && point_B.x == point_C.x) continue; }els

atcoder #082 E 暴力 计算几何

给出点集,然后求一个凸包的所有的子凸包的贡献总和,贡献计算是凸包内部含边界上点的数量N,凸包的不包含边界的顶点数S,贡献为$2^{N-S}$ 首先很容易想到,凸包上包含内部的所有点构成的子凸包有Sum(i = 3 ->N)C(i,N)种情况,这个式子其实就是二项式的一部分.但是有可能出现多点共线的不合法情况,所以问题转换为求所有点构成的直线中,每条直线上大于2点的点的数目,每条直线都要分别计算,最后减去就行了.求共线可以用叉积可以用斜率,注意判重. 这场比赛迟了10分钟才写,这题开始还在用凸包搞

2016.7.15.2014noip模拟赛D1(和昨天那个不一样,但同样网上搜不到

1.      合理种植 (plant.pas/.c/.cpp) [问题描述] 大COS在氯铯石料场干了半年,受尽了劳苦,终于决定辞职.他来到表弟小cos的寒树中学,找到方克顺校长,希望寻个活干. 于是他如愿以偿接到了一个任务…… 美丽寒树中学种有许多寒树.方克顺希望校园无论从什么角度看都是满眼寒树,因此他不希望有三棵甚至更多寒树种在一条直线上.现在他把校园里n棵寒树的坐标都给了大COS,让他数出存在多少多树共线情况.(若一条直线上有三棵或以上的树,则算出现一个多树共线情况.) [输入] 输入文

hdu1337郭大侠与阴阳家

地址:http://acm.uestc.edu.cn/#/problem/show/1337 思路: 郭大侠与阴阳家 Time Limit: 3000/4000MS (Java/Others)     Memory Limit: 262144/262144KB (Java/Others) Submit Status “污秽”是自异世界“祸野”现身,危害人世的怪物.而“阴阳师”长年以来则与污秽战斗至今. 国中生少年·郭大侠曾以成为能祓除所有污秽的最强阴阳师为目标,但自从遭遇了“雏月之悲剧”后,他便

Programming Assignment 3 : Pattern Recognition

这周的这个问题是在给定一系列的点中寻找多点共线的模式. 计算机视觉重要的两个部分:特征检测(Feature Dectection)和模式识别(Pattern Recognition).特征检测提取出图片的重要特征,模式识别发掘出这些特征中的模式.这里探究的点共线的问题在现实生活中也有很多应用,比如统计数据分析. Problem. 从二维平面上的N个互不相同的点中,绘制出每个(最多)连接的4个或4个以上点集合的线段. Point data type. 给定的Point类型的API public c

自动几何推理的研究(二) 线

现在研究线. 线对象被大量使用, 为此需要仔细分析. 线对象大致分两类: 线段(L_Segment), 直线(L_Line). 线段(L_Segment) 主要用于线段相等记录(Cong_Seg), 线段等比(Ratio_Seg)记录中, 也用于线段相等集合(CSegs). 线段对象本身不作为搜索数据. 直线(L_Line) 主要用于平行线(P_Line), 垂线(T_Line), 角(AngleS) 记录中. 实现中直线以路径(G_Path)为基类, 这样与圆(Circle)共用一个实现基类,