博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ3384:Feng Shui——题解
阅读量:6339 次
发布时间:2019-06-22

本文共 2303 字,大约阅读时间需要 7 分钟。

题目大意:给一个顺时针序的多边形,求在里面放半径为r的两个圆使得两圆覆盖的面积最大,求出这样的圆的坐标。

————————————————

解题思路:将多边形内缩进r,然后求内核。

枚举点对然后根据点对距离判断是否覆盖面积最大即可。

注意:可能两圆重合。

#include
#include
#include
#include
#include
#include
#include
using namespace std;typedef double dl;const dl eps=1e-10;const int N=301;struct Point{ dl x; dl y;}p[N],point[N],q[N],z;//point,初始点 //q,暂时存可行点//p,记录可行点 int n,curcnt,cnt;dl r;//curcnt,暂时存可行点个数 //cnt,记录可行点个数inline Point getmag(Point a,Point b){ Point s; s.x=b.x-a.x;s.y=b.y-a.y; return s;}inline dl multiX(Point a,Point b){ return a.x*b.y-b.x*a.y;}inline void getline(Point x,Point y,dl &a,dl &b,dl &c){ a=y.y-x.y; b=x.x-y.x; c=y.x*x.y-x.x*y.y; return;}inline Point intersect(Point x,Point y,dl a,dl b,dl c){ Point s; dl u=fabs(a*x.x+b*x.y+c); dl v=fabs(a*y.x+b*y.y+c); s.x=(x.x*v+y.x*u)/(u+v); s.y=(x.y*v+y.y*u)/(u+v); return s; } inline void cut(dl a,dl b,dl c){ curcnt=0; for(int i=1;i<=cnt;i++){ if(a*p[i].x+b*p[i].y+c>-eps)q[++curcnt]=p[i]; else{ if(a*p[i-1].x+b*p[i-1].y+c>eps){ q[++curcnt]=intersect(p[i],p[i-1],a,b,c); } if(a*p[i+1].x+b*p[i+1].y+c>eps){ q[++curcnt]=intersect(p[i],p[i+1],a,b,c); } } } for(int i=1;i<=curcnt;i++)p[i]=q[i]; p[curcnt+1]=p[1];p[0]=p[curcnt]; cnt=curcnt; return;}inline void init(){ for(int i=1;i<=n;i++)p[i]=point[i]; z.x=z.y=0; p[n+1]=p[1]; p[0]=p[n]; point[n+1]=point[1]; cnt=n; return;}inline void regular(){ //调换方向 for(int i=1;i<(n+1)/2;i++)swap(point[i],point[n-i]); return;}inline dl dis(Point a,Point b){ return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}inline void solve(){ init(); for(int i=1;i<=n;i++){ Point ta,tb,tt; tt.x=point[i+1].y-point[i].y; tt.y=point[i].x-point[i+1].x; dl k=r/sqrt(tt.x*tt.x+tt.y*tt.y); tt.x*=k;tt.y*=k; ta.x=point[i].x+tt.x; ta.y=point[i].y+tt.y; tb.x=point[i+1].x+tt.x; tb.y=point[i+1].y+tt.y; dl a,b,c; getline(ta,tb,a,b,c); cut(a,b,c); } return;}int main(){ scanf("%d%lf",&n,&r); for(int i=1;i<=n;i++){ scanf("%lf%lf",&point[i].x,&point[i].y); } solve(); int x,y; dl res=-1; for(int i=1;i<=cnt;i++){ for(int j=i;j<=cnt;j++){ dl tmp=dis(p[i],p[j]); if(tmp>res){ res=tmp; x=i; y=j; } } } printf("%.4f %.4f %.4f %.4f\n",p[x].x,p[x].y,p[y].x,p[y].y); return 0;}

 

转载于:https://www.cnblogs.com/luyouqi233/p/8118654.html

你可能感兴趣的文章
rsync+inotify触发式远程同步
查看>>
优秀设计师应当知道的几大UI设计原则(一)
查看>>
mongodb高级查询
查看>>
struts2.1 struts.devMode BUG解决方案
查看>>
日本法院裁定三星诉苹果专利侵权案败诉
查看>>
Windows Server 2012R2 桌面体验问题直通车
查看>>
Springboot配置文件读取报错Configuration property name 'projectUrl' is not valid:
查看>>
HTTP状态码
查看>>
今天的学习
查看>>
面试必问之JVM原理
查看>>
mysql主主同步+Keepalived
查看>>
研究音频编解码要看什么书
查看>>
tomcat远程调试配置
查看>>
QuartZ Cron表达式
查看>>
性能测试工具VTune的功能和用法介绍
查看>>
音频视频组件Audio DJ Studio for .NET更新至v10.0.0.0丨附下载
查看>>
Pig的输入输出及foreach,group关系操作
查看>>
TechParty - Code For Public - sz
查看>>
emacs 前端插件推荐[emmet-mode]
查看>>
dnsmasq配置文件
查看>>