传送门:Boundary 

题意:给你n个点的坐标,问最多有多少个点可以在同一个圆上,(0,0)必须在这个圆上。

题解:三个点确定一个圆,所以暴力枚举两个点和(0,0)组成的圆,如果三个点不共线的话,用圆心公式求出圆心,然后用map记录以当前点为圆心的点圆的个数,边记录边判断有多少个圆圆心是同一个点,取最大值就好了。

 1 #include<bits/stdc++.h>
2 #define ll long long
3 #define pb push_back
4 #define ft first
5 #define sd second
6 #define pii pair<int,int>
7 #define pll pair<ll,ll>
8 using namespace std;
9
10 const int maxn=2e6+10;
11
12 struct Point{
13 double x,y;
14 }p[maxn];
15
16 map<pair<double,double>,int>mp;
17 int ans=0;
18
19 void solve(Point a,Point b,Point c)//三点共圆圆心公式
20 {
21 double x=( (a.x*a.x-b.x*b.x+a.y*a.y-b.y*b.y)*(a.y-c.y)-(a.x*a.x-c.x*c.x+a.y*a.y-c.y*c.y)*(a.y-b.y) ) / (2.0*(a.y-c.y)*(a.x-b.x)-2*(a.y-b.y)*(a.x-c.x));
22 double y=( (a.x*a.x-b.x*b.x+a.y*a.y-b.y*b.y)*(a.x-c.x)-(a.x*a.x-c.x*c.x+a.y*a.y-c.y*c.y)*(a.x-b.x) ) / (2.0*(a.y-b.y)*(a.x-c.x)-2*(a.y-c.y)*(a.x-b.x));
23 mp[{x,y}]++;
24 ans=max(ans,mp[{x,y}]);
25 }
26
27 int main()
28 {
29 ios::sync_with_stdio(false);
30 cin.tie(0);
31 cout.tie(0);
32 int n;
33 cin>>n;
34 for(int i=0;i<n;i++){
35 cin>>p[i].x>>p[i].y;
36 }
37 for(int i=0;i<n;i++){
38 mp.clear();
39 for(int j=i+1;j<n;j++){
40 if(p[i].x*p[j].y==p[i].y*p[j].x) continue;
41 solve({0.0,0.0},p[i],p[j]);
42 }
43 }
44 cout<<ans+1<<endl;
45 return 0;
46 }

PS:因为有人留言问,博主又有了肝的动力(T^T),按照出题人题解ppt的方法写了一下代码,debug了半天,精度确实会有问题,用数组存起来,遍历差值<1e-10的就好了,如果这个小于的值太大的话会过不去的。下边代码里有个地方k==0特判一下才能过,不然有一组数据过不去,个人认为是sort函数不能sort(a,a)这样写,不知道是不是这个地方。不是这个原因。)因为有可能所有点都共线,这样的话就取不到三个点共圆,但是如果没写的话就会多出一个点。

出题人的题解:

代码:

 1 #include<bits/stdc++.h>
2 #define ll long long
3 #define pb push_back
4 #define ft first
5 #define sd second
6 #define pii pair<int,int>
7 #define pll pair<ll,ll>
8 using namespace std;
9
10 const int maxn=2e6+10;
11
12 struct Point{
13 double x,y;
14 }p[maxn];
15
16 double dis(Point x,Point y)
17 {
18 return sqrt((x.x-y.x)*(x.x-y.x)+(x.y-y.y)*(x.y-y.y));
19 }
20
21 double dis2(Point x,Point y)
22 {
23 return (x.x-y.x)*(x.x-y.x)+(x.y-y.y)*(x.y-y.y);
24 }
25
26 double mp[maxn];
27 int ans=0;
28
29 int main()
30 {
31 ios::sync_with_stdio(false);
32 cin.tie(0);
33 cout.tie(0);
34 int n;
35 cin>>n;
36 if(n==1){
37 cout<<1<<endl;
38 return 0;
39 }
40 for(int i=0;i<n;i++){
41 cin>>p[i].x>>p[i].y;
42 }
43 for(int i=0;i<n;i++){ //枚举p
44 int k=0;
45 for(int j=0;j<n;j++){ //枚举A
46 if(p[i].x*p[j].y>=p[i].y*p[j].x) continue; //A在op的左边或者共线,就不要
47 double ap1=dis(p[i],p[j]);
48 double oa1=dis({0.0,0.0},p[j]);
49 double ap2=dis2(p[i],p[j]);
50 double op2=dis2({0.0,0.0},p[i]);
51 double oa2=dis2({0.0,0.0},p[j]);
52
53 double q=(ap2+oa2-op2)/2.0/ap1/oa1; //cos(∠OAP)
54 double angle=acos(q); //∠OAP
55 mp[k++]=angle;
56 }
57 if(k==0) continue; //因为有可能全都共线,这样的话是不能取的,不然会多一个点
58 sort(mp,mp+k);
59 int cnt=1;
60 for(int i=1;i<k;i++){
61 if(fabs(mp[i]-mp[i-1])<1e-10) cnt++;
62 else cnt=1;
63 ans=max(ans,cnt);
64 }
65 ans=max(ans,cnt);
66 }
67 cout<<ans+1<<endl;
68 return 0;
69 }

2020牛客暑期多校训练营(第二场) Boundary的更多相关文章

  1. 2020牛客暑期多校训练营 第二场 K Keyboard Free 积分 期望 数学

    LINK:Keyboard Free 我要是会正经的做法 就有鬼了. 我的数学水平没那么高. 三个同心圆 三个动点 求围成三角形面积的期望. 不会告辞. 其实可以\(n^2\)枚举角度然后算出面积 近 ...

  2. 2020牛客暑期多校训练营 第二场 J Just Shuffle 置换 群论

    LINK:Just Shuffle 比较怂群论 因为没怎么学过 置换也是刚理解. 这道题是 已知一个置换\(A\)求一个置换P 两个置换的关键为\(P^k=A\) 且k是一个大质数. 做法是李指导教我 ...

  3. 2020牛客暑期多校训练营 第二场 I Interval 最大流 最小割 平面图对偶图转最短路

    LINK:Interval 赛时连题目都没看. 观察n的范围不大不小 而且建图明显 考虑跑最大流最小割. 图有点稠密dinic不太行. 一个常见的trick就是对偶图转最短路. 建图有点复杂 不过建完 ...

  4. 2020牛客暑期多校训练营 第二场 C Cover the Tree 构造 贪心

    LINK:Cover the Tree 最受挫的是这道题,以为很简单 当时什么都想不清楚. 先胡了一个树的直径乱搞的贪心 一直过不去.后来意识到这类似于最经典长链剖分优化贪心的做法 然后那个是求最大值 ...

  5. 2020牛客暑期多校训练营 第二场 B Boundary 计算几何 圆 已知三点求圆心

    LINK:Boundary 计算几何确实是弱项 因为好多东西都不太会求 没有到很精通的地步. 做法很多,先说官方题解 其实就是枚举一个点 P 然后可以发现 再枚举一个点 然后再判断有多少个点在圆上显然 ...

  6. 2020牛客暑期多校训练营 第二场 A All with Pairs 字符串hash KMP

    LINK:All with Pairs 那天下午打这个东西的时候状态极差 推这个东西都推了1个多小时 (比赛是中午考试的我很困 没睡觉直接开肝果然不爽 一开始看错匹配的位置了 以为是\(1-l\)和\ ...

  7. 2019牛客暑期多校训练营(第二场) H-Second Large Rectangle(单调栈)

    题意:给出由01组成的矩阵,求求全是1的次大子矩阵. 思路: 单调栈 全是1的最大子矩阵的变形,不能直接把所有的面积存起来然后排序取第二大的,因为次大子矩阵可能在最大子矩阵里面,比如: 1 0 0 1 ...

  8. 2020牛客暑假多校训练营 第二场 H Happy Triangle set 线段树 分类讨论

    LINK:Happy Triangle 这道题很容易. 容易想到 a+b<x a<x<b x<a<b 其中等于的情况在第一个和第三个之中判一下即可. 前面两个容易想到se ...

  9. 2020牛客暑假多校训练营 第二场 G Greater and Greater bitset

    LINK:Greater and Greater 确实没能想到做法. 考虑利用bitset解决问题. 做法是:逐位判断每一位是否合法 第一位 就是 bitset上所有大于\(b_1\)的位置 置为1. ...

  10. 2020牛客暑假多校训练营 第二场 E Exclusive OR FWT

    LINK:Exclusive OR 没做出 原因前面几篇说过了. 根据线性基的知识容易推出 不超过\(w=log Mx\)个数字即可拼出最大值 其中Mx为值域. 那么考虑w+2个数字显然也为最大值.. ...

随机推荐

  1. Vim 自动添加脚本头部信息

    每次写脚本还在为忘记添加头部信息啥的烦恼? 按照下面这么做,帮你减轻点烦恼. # 打开配置文件: vim /root/.vimrc # 添加如下信息: autocmd BufNewFile *.sh ...

  2. Java 反射修改类的常量值、静态变量值、属性值

    前言 有的时候,我们需要修改一个变量的值,但变量也许存在于 Jar 包中或其他位置,导致我们不能从代码层面进行修改,于是我们就用到了下面的场景,通过反射来进行修改变量的值. 定义一个实体类 class ...

  3. Sentry(v20.12.1) K8S 云原生架构探索,SENTRY FOR JAVASCRIPT 故障排除

    系列 Sentry-Go SDK 中文实践指南 一起来刷 Sentry For Go 官方文档之 Enriching Events Snuba:Sentry 新的搜索基础设施(基于 ClickHous ...

  4. 【Java】变量

    变量 文章目录 变量 1.变量的概念 2.变量的三要素 3.变量的使用应该注意什么? 4.变量的声明和赋值.使用的语法格式? 5.code 1.变量的概念 变量的作用:变量用来存储数据. 变量的本质: ...

  5. 过压保护IC和带LDO模式的Li+充电器前端保护IC

    PW2601是一种充电器前端集成电路,旨在为锂离子提供保护电池充电电路故障.该设备监测输入电压,电池电压以及充电电流,以确保所有三个参数都在正常范围内工作.这个该设备将关闭内部MOSFET断开,以保护 ...

  6. JAVA中@Override的含义

    @Override是伪代码,表示重写(当然不写也可以),不过写上有如下好处: 1.可以当注释用,方便阅读: 2.编译器可以给你验证@Override下面的方法名是否是你父类中所有的,如果没有则报错.例 ...

  7. HTTPS请求HTTP接口被浏览器阻塞,python实现websocket客户端,websocket服务器,跨域问题,dwebsocket,https,拦截,服务端

    HTTPS请求HTTP接口被浏览器阻塞,python实现websocket客户端,websocket服务器,跨域问题,dwebsocket,https,拦截,服务端 发表时间:2020-03-05 1 ...

  8. Redis 实战 —— 06. 持久化选项

    持久化选项简介 P61 Redis 提供了两种不同的持久化方法来将数据存储到硬盘里面. RDB(redis database):可以将某一时刻的所有数据都写入硬盘里面.(保存的是数据本身) AOF(a ...

  9. 使用注解的形式对token进行验证

    @[TOC](使用注解的形式对token进行验证)# 前言现在很多系统都是都用上了springboot.springcloud,系统也偏向分布式部署.管理,最早的用户令牌方案:session.cook ...

  10. 并发编程之fork/join(分而治之)

    1.什么是分而治之 分而治之就是将一个大任务层层拆分成一个个的小任务,直到不可拆分,拆分依据定义的阈值划分任务规模. fork/join通过fork将大任务拆分成小任务,在将小任务的结果join汇总 ...