洛谷 1783 海滩防御
来源:互联网 发布:肃清网络环境 英文 编辑:程序博客网 时间:2024/04/26 15:47
题目描述
WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和仓库总是被敌方派人偷袭。于是,WLP动用了他那丰满且充实的大脑(或许更偏向前者),想出了一个好主意,他把海滩分成垂直于海岸线的若干列,在其中的几列上放置几个信号塔,试图来监视整个海滩。然而,WLP是一个非常心急的人,他把信号塔建好后才发现还需给信号塔供能,它们才能投入使用(这不是废话么),它们都有一个工作半径,一个圆形区域里的所有敌人都逃不过它们的监视,不过,WLP发现,敌人们非常狡猾,除非他将道路完全封死,否则WLP的敌人可以走过一条任意弯曲的路(不一定走整点,但是不会出第0列和第N列构成的边界)来偷他的东西。
于是,WLP就思考了:到底需要给每个信号塔多大的工作半径,才能将从海滩到内地的路径完全封死呢?他再次动用了他那丰满且充实的大脑,想了一堂数学课,终于,还是没想出来。于是,他向LZZ神犇求助(额……C_SUNSHINE的身份是不是暴露了)。
终于,在WLP:“%^!@#!(^!#@$^&(此处省略无数卖萌场景)”的哀求下,LZZ神犇写了一个程序,在1s内就解决了问题。但是,邪恶的LZZ神犇决定要将这个难题共享给无数无辜的OIer,所以,现在轮到你了。
输入输出格式
输入格式:
第一行两个整数N和M:表示海滩被WLP分成的列数0-N和信号塔个数。
第2-M+1行:每行两个数Xi,Yi表示1-M号信号塔所在的列数和离开海滩的距离。
输出格式:
一行一个实数,表示最小的工作半径,保留两位小数。
输入输出样例
【输入样例1】
5 5
1 5
3 5
5 5
4 30
2 15
【输入样例2】
100 2
30 50
90 100
【输出样例1】
1.00
【输出样例2】
39.05
说明
对于10%的数据:1≤M≤10,1≤Yi≤100;
对于30%的数据:1≤M≤50,1≤Yi≤1,000;
对于80%的数据:1≤M≤500,1≤Yi≤1,000;
对于100%的数据:1≤M≤800,1≤N≤1000,1≤Xi≤N,1≤Yi≤100,000.
【样例解释】
注意,封锁海滩是指,敌人的深入程度是有限制的,若敌人绕过了所有的信号塔,并且可以长驱直入,那么就说明道路没有完全封锁。
/************************** Name:1783 海滩防御 How to get:luogu.org By:Shine_Sky**************************//******************************* 一开始还真打算用标签的二分做 然而想不出如何判断答案是否正确 看了下题解 就看见了最小生成树 我在看了下题 我们把0和n+1设置成起点 和终点 只要这两个点连在一起 那么沙滩就会出现一条封锁线 其中 代价是最大半径(一直在疑惑题解中为什么一连到了就输出当前边) 结果发现 Kruskal是从小到大排序了的 我们要求出的代价就是最大边权,不是和! *******************************/#include<iostream>#include<cstdio>#include<cmath>#include<algorithm>#define f(i,a,b) for(register int i=a;i<=b;i++)#define fd(i,a,b) for(register int i=a;i>=b;i--)using namespace std;inline int read(){ int data=0,w=1; char ch=0; while(ch!='-' && (ch<'0' || ch>'9')) ch=getchar(); if(ch=='-') w=-1,ch=getchar(); while(ch>='0' && ch<='9') data=data*10+ch-'0',ch=getchar(); return data*w;}inline void write(int x){ if(x<0) putchar('-'),x=-x; if(x>9) write(x/10); putchar(x%10+'0');}const int N=1000+7;int n=read(),m=read(),tot,x[N],y[N],tream[N];struct Node{ int u,v; double w;}a[N*N];inline double Get_Distance(int x1,int y1,int x2,int y2)//练英文的好时机{ return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));} inline bool cmp(Node a,Node b){ return a.w<b.w;}inline int Get_Father(int x){ if(tream[x]==x) return x; return tream[x]=Get_Father(tream[x]);}int main(){ f(i,0,m+1) tream[i]=i; f(i,1,m) x[i]=read(),y[i]=read(); f(i,1,m) f(j,i+1,m) a[++tot].u=i,a[tot].v=j,a[tot].w=Get_Distance(x[i],y[i],x[j],y[j])/2; //f(i,1,m) // f(j,i+1,m) // printf("i=%d,j=%d,w=%lf\n",i,j,Get_Distance(x[i],y[i],x[j],y[j]))/2; f(i,1,m) a[++tot].u=i,a[tot].v=0,a[tot].w=x[i], //与边上的距离是看x 之前一直大的是y就搞错了 a[++tot].u=i,a[tot].v=m+1,a[tot].w=n-x[i]; sort(a+1,a+tot+1,cmp);// f(i,1,tot) // printf("u=%d,v=%d,w=%lf\n",a[i].u,a[i].v,a[i].w); int ansi=0; while(Get_Father(0)!=Get_Father(m+1))//连上去了就不要继续了 { ansi++; int U=Get_Father(a[ansi].u),V=Get_Father(a[ansi].v); if(U!=V) tream[U]=V; } //write(ansi); printf("%.2lf",a[ansi].w); return 0;}
- 洛谷 1783 海滩防御
- 洛谷-1783 海滩防御
- 洛谷 P1783 海滩防御
- 洛谷P1783 海滩防御 分析+题解代码
- 金海滩
- 海滩生活
- 海滩烧烤
- 海滩上的思想者
- 瞌睡虫情迷上海滩
- 玛雅海滩水公园
- 夜中海滩漫步
- 纵情美丽的海滩城市
- 在海滩上拾贝壳
- 金山城市海滩攻略(上海松江)
- 海口胜地-假日海滩-沙滩烧烤
- 关于海滩争霸Crab代码的理解
- 海滩上最少有多少个桃子
- 新月集之海滩拾贝
- QT界面显示实时时间
- Linux常用命令
- 是时候好好思考规划一下
- npm升级及cnpm安装
- 从DLL中导出变量
- 洛谷 1783 海滩防御
- linux系统基本命令行操作(六)
- Spring Boot 快速入门
- Python字符串格式化输出
- 从DLL中导出类
- 五分钟了解你不得不知道的人工智能热门词汇
- 树莓派安装ubuntu mate
- J2EE学习笔记(六)之Spring原理
- OpenCV学习笔记(08):opencv3.2+cmake3.8+VS2013,编译opencv_contrib