2020牛客暑期多校训练营(第二场) Boundary
传送门: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的更多相关文章
- 2020牛客暑期多校训练营 第二场 K Keyboard Free 积分 期望 数学
LINK:Keyboard Free 我要是会正经的做法 就有鬼了. 我的数学水平没那么高. 三个同心圆 三个动点 求围成三角形面积的期望. 不会告辞. 其实可以\(n^2\)枚举角度然后算出面积 近 ...
- 2020牛客暑期多校训练营 第二场 J Just Shuffle 置换 群论
LINK:Just Shuffle 比较怂群论 因为没怎么学过 置换也是刚理解. 这道题是 已知一个置换\(A\)求一个置换P 两个置换的关键为\(P^k=A\) 且k是一个大质数. 做法是李指导教我 ...
- 2020牛客暑期多校训练营 第二场 I Interval 最大流 最小割 平面图对偶图转最短路
LINK:Interval 赛时连题目都没看. 观察n的范围不大不小 而且建图明显 考虑跑最大流最小割. 图有点稠密dinic不太行. 一个常见的trick就是对偶图转最短路. 建图有点复杂 不过建完 ...
- 2020牛客暑期多校训练营 第二场 C Cover the Tree 构造 贪心
LINK:Cover the Tree 最受挫的是这道题,以为很简单 当时什么都想不清楚. 先胡了一个树的直径乱搞的贪心 一直过不去.后来意识到这类似于最经典长链剖分优化贪心的做法 然后那个是求最大值 ...
- 2020牛客暑期多校训练营 第二场 B Boundary 计算几何 圆 已知三点求圆心
LINK:Boundary 计算几何确实是弱项 因为好多东西都不太会求 没有到很精通的地步. 做法很多,先说官方题解 其实就是枚举一个点 P 然后可以发现 再枚举一个点 然后再判断有多少个点在圆上显然 ...
- 2020牛客暑期多校训练营 第二场 A All with Pairs 字符串hash KMP
LINK:All with Pairs 那天下午打这个东西的时候状态极差 推这个东西都推了1个多小时 (比赛是中午考试的我很困 没睡觉直接开肝果然不爽 一开始看错匹配的位置了 以为是\(1-l\)和\ ...
- 2019牛客暑期多校训练营(第二场) H-Second Large Rectangle(单调栈)
题意:给出由01组成的矩阵,求求全是1的次大子矩阵. 思路: 单调栈 全是1的最大子矩阵的变形,不能直接把所有的面积存起来然后排序取第二大的,因为次大子矩阵可能在最大子矩阵里面,比如: 1 0 0 1 ...
- 2020牛客暑假多校训练营 第二场 H Happy Triangle set 线段树 分类讨论
LINK:Happy Triangle 这道题很容易. 容易想到 a+b<x a<x<b x<a<b 其中等于的情况在第一个和第三个之中判一下即可. 前面两个容易想到se ...
- 2020牛客暑假多校训练营 第二场 G Greater and Greater bitset
LINK:Greater and Greater 确实没能想到做法. 考虑利用bitset解决问题. 做法是:逐位判断每一位是否合法 第一位 就是 bitset上所有大于\(b_1\)的位置 置为1. ...
- 2020牛客暑假多校训练营 第二场 E Exclusive OR FWT
LINK:Exclusive OR 没做出 原因前面几篇说过了. 根据线性基的知识容易推出 不超过\(w=log Mx\)个数字即可拼出最大值 其中Mx为值域. 那么考虑w+2个数字显然也为最大值.. ...
随机推荐
- Spring中的@Valid 和 @Validated注解你用对了吗
1.概述 本文我们将重点介绍Spring中 @Valid和@Validated注解的区别 . 验证用户输入是否正确是我们应用程序中的常见功能.Spring提供了@Valid和@Validated两个注 ...
- git文件操作
git下载地址: https://git-scm.com/download mac 直接使用brew下载brew install git 1Git一般工作流程: 1.在工作目录创建版本库 2.在工作目 ...
- 【Problems】:JSON parse error: Invalid UTF-8 start byte 0xbd;
简单记录一下 ,我本地开发环境这样写测试时没有问题, @ApiOperation(value="取消关注") @PostMapping("cancelFollow&quo ...
- 【ORA】ORA-16629解决办法
数据库向保护模式报告不同的保护级别"警告消息. 首先查看主备库的保护模式和保护级别 select protection_mode,protection_level from v$databa ...
- UVA - 387 A Puzzling Problem
题目链接: https://vjudge.net/problem/UVA-387 思路: 非常有意思的拼图,深搜+回溯, 输出硬伤:除了第一次之外,每次先输空格,再输出结果, 以及可能给的数据拼不成4 ...
- 攻防世界 - Web(三)
PHP2: 1.进入页面,进行抓包或后台扫描都没有什么发现,然后网上查一波wp,发现是关于.phps文件,进入index.phps,弹出一段代码,查看源代码, <?php if("ad ...
- CTFshow-萌新赛杂项_签到
查看网页信息 http://game.ctf.show/r2/ 把网页源码下载后发现有大片空白 使用winhex打开 把这些16进制数值复制到文件中 把20替换为0,09替换为1后 得到一串二进制数值 ...
- git创建分支并关联远程分支
1.新建本地分支: 如图,再输入你的分支名字,然后选择从哪个远程分支拉代码,如选择master 至此本地分支创建完成. 2.关联远程分支: (1).先输入git branch -vv,看看分支与远程分 ...
- 小白的经典CNN复现(二):LeNet-5
小白的经典CNN复现(二):LeNet-5 各位看官大人久等啦!我胡汉三又回来辣(不是 最近因为到期末考试周,再加上老板临时给安排了个任务,其实LeNet-5的复现工作早都搞定了,结果没时间写这个博客 ...
- unity3D进阶
前言 在之前的例子中,我们都没有用到unity的精髓,例如地形系统.物理系统.粒子系统等,本文记录unity3D的进阶简单应用 前期准备 https://unity.cn/releases/full/ ...