洛谷P1927 防护伞题解

文章讲述了如何通过枚举黑子坐标,利用勾股定理计算黑子之间的距离,确定覆盖所有黑子的最小半径,从而计算出棋盘上黑子区域的面积的编程问题解决方案。

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

emmmm……

百无聊赖的我又来写题解了……(欸嘿,水一下)

再放个传送锚点

(其实本来我做这道题是因为我的老师在学校的信竞网站上布置了这道题,结果我在洛谷上又发现了这道题……)

这道题其实很简单,一个枚举即可解决

枚举思路:

遍历每一个黑子(?)坐标,找到距离它最远的黑子,以它们的距离为半径,这样就可以覆盖所有黑子,再从中找到一个最短半径(不知道为什么,直接在这里计算面积会WA),计算面积就可以了

但!是!

黑子之间的距离该怎么计算呢?

其实很很很很easy

毕达哥拉斯定理(勾股定理)知道吗?

不知道也没逝,我只说结论:

(x1, y1)和(x2, y2)之间的距离s=\sqrt{(x1-x2)^{2}+(y1-y2)^{2}}

写成代码长这样(记得转换成double类型):s = sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));

该放代码的时候了!

#include<bits/stdc++.h>
using namespace std;
int n; 
struct node{
	int x,y;
}sbs[12000];//黑子(Sun Black Son?)坐标 
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>sbs[i].x;
		cin>>sbs[i].y;
	}
	double minr=INT_MAX;//记录最小半径 
	for(int i=1;i<=n;i++)//遍历每一个黑子坐标 
	{
		double r=-INT_MAX;//记录半径 
		for(int j=1;j<=n;j++)//遍历后面每一个未计算过的坐标 
		{
			r=max(r,sqrt(double((sbs[i].x-sbs[j].x)*(sbs[i].x-sbs[j].x))+double((sbs[i].y-sbs[j].y)*(sbs[i].y-sbs[j].y))));//计算并记录半径
		}
		minr=min(minr,r);//最小半径 
	}
	printf("%.4f",minr*minr*3.1415926535);//输出面积
	return 0;
}

补充:1.勾股定理(数学术语)_百度百科 (baidu.com)

           2.无注释AC代码:

#include<bits/stdc++.h> 
using namespace std;
int n; 
struct node{
	int x,y;
}sbs[12000];
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>sbs[i].x;
		cin>>sbs[i].y;
	}
	double minr=INT_MAX;
	for(int i=1;i<=n;i++) 
	{
		double r=-INT_MAX;
		for(int j=1;j<=n;j++) 
		{
			r=max(r,sqrt(double((sbs[i].x-sbs[j].x)*(sbs[i].x-sbs[j].x))+double((sbs[i].y-sbs[j].y)*(sbs[i].y-sbs[j].y))));
		}
		minr=min(minr,r);
	}
	printf("%.4f",minr*minr*3.1415926535);
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值