2020牛客暑期多校训练营Boundary(计算几何,枚举)

博客主要介绍了2020年牛客暑期多校训练营中的一道计算几何题目——Boundary。题目要求在坐标系中,给定多个点,找出最多有多少个点可以与原点一起共圆。解决方案是通过枚举两点,利用圆心公式求解圆心,然后计算满足条件的点的数量。博客内容包括题目的描述、输入输出格式、示例、解题思路及代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Boundary

题目描述

在这里插入图片描述

输入描述:

在这里插入图片描述

输出描述:

在这里插入图片描述

示例1

输入

4
1 1
0 2
2 0
2 2

输出

3

说明

在这里插入图片描述

题目大意

给定坐标系中n个点的坐标,求最多有多少点在同一圆上,且原点也在圆上。

分析

枚举点,然后再枚举另一点,通过圆心公式代出圆心坐标,然后求最多对于同一点一,有多少点二使得圆心同一点,答案+1即可。
(因为有n条线算上原来)

圆心公式

xx=((y[j]-y[i])*y[i]*y[j]-x[i]*x[i]*y[j]+x[j]*x[j]*y[i])/(x[j]*y[i]-x[i]*y[j])
yy=((x[j]-x[i])*x[i]*x[j]-y[i]*y[i]*x[j]+y[j]*y[j]*x[i])/(y[j]*x[i]-y[i]*x[j])

代码

#include<bits/stdc++.h>
#define ll long long
#define ld long double
#define inf 1<<30
using namespace std;
const int MAXN=2010;
ld x[MAXN],y[MAXN];
map<pair<ld,ld>,int> mp;//用map统计
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    	cin>>x[i]>>y[i];
    ll ans=0,now;
    for(int i=1;i<=n;i++){
    	mp.clear();//每次枚举完点一后要清空
    	for(int j=i+1;i<=n;i++){
    		if(x[i]*y[j]-x[j]*y[i]==0) continue;//三点共线无圆
    		ld xx=((y[j]-y[i])*y[i]*y[j]-x[i]*x[i]*y[j]+x[j]*x[j]*y[i])/(x[j]*y[i]-x[i]*y[j]);
			ld yy=((x[j]-x[i])*x[i]*x[j]-y[i]*y[i]*x[j]+y[j]*y[j]*x[i])/(y[j]*x[i]-y[i]*x[j]);
    		++mp[pair<ld,ld>(xx,yy)];
    		ans=max(ans,(ll)mp[pair<ld,ld>(xx,yy)]);
		}
	}
	printf("%lld\n",ans+1);//+1即可
}

END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值