• P1783 海滩防御


    P1783 海滩防御

    题目描述

    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:
    【输入样例1】
    5 5
    1 5
    3 5
    5 5
    4 30
    2 15
    
    【输入样例2】
    100 2
    30 50
    90 100
    输出样例#1:
    【输出样例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.

    【样例解释】

    注意,封锁海滩是指,敌人的深入程度是有限制的,若敌人绕过了所有的信号塔,并且可以长驱直入,那么就说明道路没有完全封锁。

    最小生成树,设一个0点和一个m+1点,分别是起点与终点,然后将各个点连起一条边,kruskal。

     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<cmath>
     4 
     5 using namespace std; 
     6 const int MAXN = 810;
     7 struct Edge{
     8     int x,y;
     9     double w;
    10     bool operator < (const Edge &a) const 
    11     {
    12         return w < a.w;
    13     }
    14 }e[MAXN*MAXN];
    15 int n,m,p,cnt;
    16 int x[MAXN],y[MAXN],fa[MAXN]; 
    17 
    18 int find(int x)
    19 {
    20     return x==fa[x]?x:fa[x]=find(fa[x]);
    21 }
    22 
    23 int main()
    24 {
    25     scanf("%d%d",&n,&m);
    26     for (int i=1; i<=m; ++i)
    27         scanf("%d%d",&x[i],&y[i]);
    28     for (int i=1; i<=m; ++i)
    29         for (int j=i+1; j<=m; ++j)
    30         {
    31             e[++cnt].x = i;
    32             e[cnt].y = j;
    33             e[cnt].w = (double)sqrt(abs(x[i]-x[j])*abs(x[i]-x[j])+abs(y[i]-y[j])*abs(y[i]-y[j]))/2;
    34         }
    35     for (int i=1; i<=m; ++i)
    36     {
    37         e[++cnt].x = 0;
    38         e[cnt].y = i;
    39         e[cnt].w = (double)x[i];
    40         e[++cnt].x = i;
    41         e[cnt].y = m+1;
    42         e[cnt].w = (double)(n-x[i]);
    43     }
    44     for (int i=0; i<=m+1; ++i) fa[i] = i;
    45     sort(e+1,e+cnt+1);
    46     while (find(0)!=find(m+1))
    47     {
    48         ++p;
    49         int rx = find(e[p].x);
    50         int ry = find(e[p].y);
    51         if (rx!=ry) fa[rx] = ry;
    52     }
    53     printf("%.2lf",e[p].w);
    54     return 0;
    55 }
  • 相关阅读:
    jQuery的简单应用
    JQuery事件
    [django]数据导出excel升级强化版(很强大!)
    [Django]用户权限学习系列之权限管理界面实现
    [Django]用户权限学习系列之设计自有权限管理系统设计思路
    [jquery]显示隐藏div标签的几种方法
    [Django]用户权限学习系列之User权限基本操作指令
    [jquery]jquery正则表达式验证(手机号、身份证号、中文名称)
    [Django]用户权限学习系列之Permission权限基本操作指令
    [python]set集合学习
  • 原文地址:https://www.cnblogs.com/mjtcn/p/7095507.html
Copyright © 2020-2023  润新知