CodeForces 614C Peter and Snow Blower
2024-08-24 06:08:22
简单计算几何,只要算出圆心到多边形上的最短距离和最长距离即可
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std; const int maxn=+;
struct Point
{
double x,y;
} p[maxn];
double a,b;
int n; double GetPointDistance(Point p1, Point p2)
{
return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
} double GetNearestDistance(Point PA, Point PB, Point P3)
{
double a,b,c;
a=GetPointDistance(PB,P3);
if(a<=0.00001) return 0.0f;
b=GetPointDistance(PA,P3);
if(b<=0.00001) return 0.0f;
c=GetPointDistance(PA,PB);
if(c<=0.00001) return a;
if(a*a>=b*b+c*c) return b;
if(b*b>=a*a+c*c) return a;
double l=(a+b+c)/;
double s=sqrt(l*(l-a)*(l-b)*(l-c));
return *s/c;
} int main()
{
double Max=-;
double Min=-;
scanf("%d%lf%lf",&n,&a,&b);
Point T;
T.x=a;
T.y=b;
for(int i=; i<n; i++) scanf("%lf%lf",&p[i].x,&p[i].y);
for(int i=; i<n; i++)
{
double MinLen=GetNearestDistance(p[(i+)%n],p[i],T);
if(Min==-) Min=MinLen;
else Min=min(Min,MinLen); double Len1=sqrt((p[i].x-a)*(p[i].x-a)+(p[i].y-b)*(p[i].y-b));
double Len2=sqrt((p[(i+)%n].x-a)*(p[(i+)%n].x-a)+(p[(i+)%n].y-b)*(p[(i+)%n].y-b));
double MaxLen=max(Len1,Len2);
if(Max==-) Max=MaxLen;
else Max=max(Max,MaxLen);
} printf("%lf\n",3.1415926*(Max*Max-Min*Min));
return ;
}
最新文章
- Useful links
- 【转】eclipse导入V7包出现错误解决办法
- osg中的视点控制
- struts2:struts.xml配置文件详解
- img下出现几像素空白的问题
- jquery设置div,文本框 表单的值示例
- Unity3D脚本中文系列教程(十二)
- swift版本hello
- 龙芯8089_D安装debian 8 iessie
- JavaScript-学习一全局变量
- Yii2.0中文开发向导——删除数据
- Go Code
- quartz 定时任务
- AdobeFlashBuilder还不如AdobeFlashProfessional写actionscript体验好
- bzoj2683简单题 cdq分治
- Android开发学习之路--数据持久化之初体验
- mysql数据库优化(转)
- 排列组合n选m算法
- struts2框架学习笔记4:获取参数
- Android 图表