博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【JZOJ5094】【GDSOI2017第四轮模拟day3】鸽子 计算几何+floyd
阅读量:4671 次
发布时间:2019-06-09

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

题面

养鸽人要监视他的鸽子,有n只鸽子站在平面上,他可以在m个给定的点上设置监视器,如果一只鸽子在某个监视器上或者在两个监视器所连直线上或者在三个监视器所连直线的三角形内则其就咕咕咕了,现在养鸽人要让所有鸽子咕咕咕,请问他最少需要设置多少监视器。

对于100%的数据n≤100000,m≤500,坐标绝对值不超过10的9次方。

100

首先转化一下题意,就是选取尽量少的点,然后生成一个凸包,包住给定的一个凸包。

显然在给定凸包内的点是没有用处的。
对于不在给定凸包内的点,我们枚举它们:
对于一个点i,找出其与给定凸包的两条“切线”。
1146820-20170427154349819-1434536391.png
如图,两条切线即为x,y,那么就有使\(i\)给图中蓝色的点连一条长度为1的边。
由于凸包是,一个点出发,回到这个点的最短路。
然后做一遍floyd就可以了。

Code

#include
#define ll long long#define db double#define fo(i,x,y) for(int i=x;i<=y;i++)#define fd(i,x,y) for(int i=x;i>=y;i--)using namespace std;const int inf=0x7fffffff;const char* fin="pigeon.in";const char* fout="pigeon.out";const int maxn=100007,maxm=507;const db eps=1e-10;int equ(db v,db c){return (fabs(v-c)
0) mx=tmp,mxid=j; if (mnid==0 || equ(mn^tmp,0)<0) mn=tmp,mnid=j; if (hid==0 || high
x) low=x,lid=j; } if (equ((a[hid]-b[i])^(a[lid]-b[i]),0)<0) continue; P da=mx,xiao=mn; if (debug) xiao.p(),da.p(); da.ni(); fo(j,1,m) if (i!=j){ P tmp=b[j]-b[i]; if (debug){ tmp.p();//printf(":%lf %lf\n",xiao^tmp,tmp^da); printf(":%d %d\n",equ(xiao^tmp,0)<=0,equ(tmp^da,0)<=0); } if (equ(xiao^tmp,0)<=0 && equ(tmp^da,0)<=0) f[i][j]=1; } if (debug)printf("\n"); } floyd(); int ans=inf; fo(i,1,m) ans=min(ans,f[i][i]); if (ans<2000000000) printf("%d",ans); else printf("-1"); return 0;}

转载于:https://www.cnblogs.com/hiweibolu/p/6774648.html

你可能感兴趣的文章
Shell 概述、截取字符操作等
查看>>
CTF/web
查看>>
第五章上 首次登陆
查看>>
第5堂:看到词句就会读-上
查看>>
Phpcms V9全站伪静态设置方法
查看>>
POJ 2176 Folding(区间DP)
查看>>
Dynamic Clock in Terminal.
查看>>
C# 中的委托和事件
查看>>
SHT30 Linux标准 i2c-dev 读取程序
查看>>
wpf TabControl控件的用法
查看>>
centos7忘记密码处理办法
查看>>
正确停掉 expdp 或 impdp
查看>>
Image Captioning代码复现
查看>>
UE4 打包C++项目到win32平台报错 could not find mspdbcore.dll
查看>>
sed系列:行或者模式匹配删除特定行
查看>>
python常见面试题(三)
查看>>
回文日期(NOIP2016 普及组第二题)
查看>>
[jQuery]回到顶部
查看>>
用Github做一个静态网页(GithubPages)
查看>>
Win7下修改Hosts文件
查看>>