第一次训练赛D - Peter and Snow Blower-简单几何

本文提供了一道Codeforces竞赛题目614C的详细解答过程,介绍了如何计算一个多边形绕其外部一点旋转所覆盖的面积。文章分享了作者在比赛中因误解题意而浪费时间的经验教训,并提供了清晰的解题思路和完整的代码实现。
摘要由CSDN通过智能技术生成

题目传送门:https://codeforces.com/problemset/problem/614/C

题目大意:求一个多边形绕他外面一个点转扫过的面积。

mmp比赛时看错题了,以为那个点可以在图形内,浪费了半个钟。

思路:S=PI*(点到图形最远距离^2 - 点到图形最近距离^2),点到图形最远距离即点到图中的最远的点的距离,最近距离可能是点到点,也可能是点到边,比赛时忘了点到边的情况。算点到边距离可以套海伦公式直接算,我是用点到线距离手工算的。

代码:

 #include <bits/stdc++.h>
#define ll long long
using namespace std;
const int M=1000000+10;
const double pi=acos(-1),eps=1e-10;
int n;
double u,v,maxd=-1,mind=-1,x[M],y[M];
int main()
{
   scanf("%d%lf%lf",&n,&u,&v);
   for(int i=0;i<n;i++) scanf("%lf%lf",&x[i],&y[i]);
   for(int i=0;i<n;i++){
   	double A=(y[i]-y[(i+1)%n]),B=(x[(i+1)%n]-x[i]),c=x[i]*y[(i+1)%n]-x[(i+1)%n]*y[i];
   	double dis=(x[i]-u)*(x[i]-u)+(y[i]-v)*(y[i]-v),dis1=abs(A*u+B*v+c)/sqrt(A*A+B*B);
   	double d=A*v-B*u;
   	double xx=-(A*c+B*d)/(A*A+B*B);
   	maxd=max(maxd,dis);
   	if(xx<=max(x[i],x[(i+1)%n])+eps && xx>=min(x[i],x[(i+1)%n])-eps)//垂足横坐标在相邻两点之间时点到线距离比点到点短
   		dis=min(dis,dis1*dis1);
   	mind=mind==-1?dis:min(dis,mind);
   }
   printf("%.10f",pi*(maxd-mind));
   return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值