题目链接:点击查看

题目大意:给出 n 个点,需要我们选择一个经过原点的圆,使得这个圆经过尽可能多的点,输出最多可以经过多少个点

题目分析:n 的大小是 2000 ,显然支持 n * n 最多再加一个 log 的写法,因为三个不共线的点确定一个圆,圆上的一个点(原点)已经确定了,所以我们可以 O( n ) 枚举一下另一个定点 P,此时大概是这个样子

最后 O( n ) 枚举点 A 时,此时不共线的三点已经可以确定一个圆了,换句话说,三个点就可以确定下来圆心的位置了,当点 P 和点 O 都确定下来后,枚举点 A 所得到的所有圆心的众数再加一,就是以此圆心做圆后可以经过的点的个数,利用map维护最大值就是答案了,找圆心的任务直接交给模板就好了

最后替出题人稍微解释一下吧,并没有卡 double 的精度,如果代码只过了 90% 或 95% 的样例的话,不妨看看下面两个特判:

1
1 0
ans=1

3
1 0
2 0
3 0
ans=1

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=2e3+100;const double eps = 1e-6;int sgn(double x){if(fabs(x) < eps)return 0;if(x < 0)return -1;else return 1;
}struct Point{double x,y;Point(){}Point(double _x,double _y){x = _x;y = _y;}void input(){scanf("%lf%lf",&x,&y);}bool operator == (Point b)const{return sgn(x-b.x) == 0 && sgn(y-b.y) == 0;}bool operator < (Point b)const{return sgn(x-b.x)== 0?sgn(y-b.y)<0:x<b.x;}Point operator -(const Point &b)const{return Point(x-b.x,y-b.y);}//叉积double operator ^(const Point &b)const{return x*b.y - y*b.x;}//返回两点的距离double distance(Point p){return hypot(x-p.x,y-p.y);}Point operator +(const Point &b)const{return Point(x+b.x,y+b.y);}Point operator /(const double &k)const{return Point(x/k,y/k);}//`逆时针旋转90度`Point rotleft(){return Point(-y,x);}
}point[N];struct Line{Point s,e;Line(){}Line(Point _s,Point _e){s = _s;e = _e;}//`两向量平行(对应直线平行或重合)`bool parallel(Line v){return sgn((e-s)^(v.e-v.s)) == 0;}//`求两直线的交点`//`要保证两直线不平行或重合`Point crosspoint(Line v){double a1 = (v.e-v.s)^(s-v.s);double a2 = (v.e-v.s)^(e-v.s);return Point((s.x*a2-e.x*a1)/(a2-a1),(s.y*a2-e.y*a1)/(a2-a1));}
};
//圆
struct circle{Point p;//圆心double r;//半径circle(){}//`三角形的外接圆`//`需要Point的+ /  rotate()  以及Line的crosspoint()`//`利用两条边的中垂线得到圆心`//`测试:UVA12304`circle(Point a,Point b,Point c){Line u = Line((a+b)/2,((a+b)/2)+((b-a).rotleft()));Line v = Line((b+c)/2,((b+c)/2)+((c-b).rotleft()));p = u.crosspoint(v);r = p.distance(a);}
};int main()
{
#ifndef ONLINE_JUDGE
//  freopen("input.txt","r",stdin);
//  freopen("output.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);int n;scanf("%d",&n);for(int i=1;i<=n;i++)point[i].input();if(n<=1)return 0*printf("%d\n",n);int ans=1;for(int i=1;i<=n;i++){map<Point,int>cnt;for(int j=i+1;j<=n;j++){if(Line(point[i],point[j]).parallel(Line(point[i],Point(0,0))))continue;circle c(point[i],point[j],Point(0,0));ans=max(ans,++cnt[c.p]+1);}}printf("%d\n",ans);return 0;
}

牛客多校2 - Boundary(几何)相关推荐

  1. 牛客多校三 B Black and white

    牛客多校三 B Black and white 在n*m的棋盘上,每个格子有一个数,初始可以选一定的格子标记为黑色,在任意四个形如(i1, j1)(i1, j2)(i2, j1)(i2, j2)的格子 ...

  2. 2019牛客多校第一场

    2019牛客多校第一场 题号 题目 知识点 A Monotonic Matrix B Symmetric Matrix C Fluorescent 2 D Two Graphs E Removal F ...

  3. LCS(2021牛客多校4)

    LCS(2021牛客多校4) 题意: 让你构造三个字符串s1,s2,s3,长度均为n,要求LCS(s1,s2)=a,LCS(s2,s3)=b,LCS(s1,s3)=c 题解: 先考虑三个串互相LCS为 ...

  4. 24dian(牛客多校第三场)

    24dian(牛客多校第三场) 题意: 给你n张牌,每张牌的大小为1 ~ 13,问这些牌与加减乘除任意组合(可以使用括号),且但所有的有效解在计算过程中都涉及到分数,即非整数,能否组成答案m,如果可以 ...

  5. 2018年牛客多校算法寒假训练营练习比赛(第一场)C. 六子冲

    2018年牛客多校算法寒假训练营练习比赛(第一场)C. 六子冲 题目链接 做法:模拟即可 #include <bits/stdc++.h> #define P pair<int,in ...

  6. 2019牛客多校第四场 I题 后缀自动机_后缀数组_求两个串de公共子串的种类数

    目录 求若干个串的公共子串个数相关变形题 对一个串建后缀自动机,另一个串在上面跑同时计数 广义后缀自动机 后缀数组 其他:POJ 3415 求两个串长度至少为k的公共子串数量 @(牛客多校第四场 I题 ...

  7. 2022牛客多校(十)

    2022牛客多校(十) 一.比赛小结 比赛链接:"蔚来杯"2022牛客暑期多校训练营10 二.题目分析及解法(基础题) F.Shannon Switching Game? 题目链接 ...

  8. 2019牛客多校训练第十场F Popping Balloons

    2019牛客多校训练第十场F Popping Balloons 题意:二维平面内给你若干个点,然后你可以在x轴和y轴分别射三枪(每一枪的间隔是R),问最多能射掉多少气球. 题解:贪心.这个应该只能算作 ...

  9. 牛客多校第十场F-Popping Balloons

    题目连接 牛客多校F-PoppingBalloons 题意: 用枪打气球,可以横着打三次,竖着打三次,横着打可以把那一行的气球全打下来,竖着打可以把那一列的气球全打下来,但是,每两次相邻的横着打或者竖 ...

最新文章

  1. 修改电脑开机时间记录6005_这些优化步骤,让你的电脑远离卡顿!
  2. python爬虫教程视频-13天搞定Python分布爬虫
  3. 八大主流Linux桌面环境特性汇总报告
  4. Python编程基础:第十七节 集合Set
  5. linux压缩文件解压乱码
  6. Eclipse2020安装了最新版本的JDK却无法打开,提示版本太老的完美解决方法
  7. boost::math模块使用来自函数调用的常量的测试程序
  8. 签入在服务器上之后,别人获取了,在解决方案资源管理器中找不到。
  9. C语言struct关键字详解—结构体
  10. 神经网络——BP算法
  11. 别急马上到你们了!携号转网全国推广工作研讨会召开
  12. 如何修改服务器上的端口号,如何修改远程服务器端口号
  13. 剑指offer——面试题45:圆圈中最后剩下的数字(孩子们的游戏)
  14. 机器学习实战-Python机器学习项目实战
  15. 在线分析丨相关性分析——RDA/CCA分析
  16. axios封装之cancelToken
  17. linux中如何从txt转为nc文件,【转】linux下nc的使用
  18. 山东科技大学计算机控制系统期末考试试卷,山东科技大学 计算机操作系统试题b...
  19. Pycharm一键选中多个东西(数据、函数等)进行修改、删除、替换等
  20. APM32F103 RTC内部时钟源报警中断例程测试

热门文章

  1. php python插件,Python:开发Sublime插件,方便PHP开发
  2. 怎么使图表居中显示_【Excel技巧】制作柱形图图表完美呈现百分比,提升您的报表颜值...
  3. 如何选择合适的垃圾收集器
  4. 回顾线程的竞争机制-轻量级锁
  5. Spring容器初始化实现V3 版本
  6. xml方式实现aop-快速入门
  7. 权限管理-整合SpringSecurity
  8. es6语法-let定义变量和常量
  9. 分布式文件系统研究-fastDFS安装及配置文件说明
  10. 工程搭建:搭建子工程之搭建实体类模块和lombok插件