zoukankan      html  css  js  c++  java
  • 洛谷 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.

    【样例解释】

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

     

    // 居然是 最小生成树 
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    #define maxn 805
    int n,m,fa[maxn],x[maxn],y[maxn],tot;
    struct Edge{
        int from,to;
        float value;
    }e[maxn*maxn];
    float GetDist(int u,int v){
        return sqrt((x[u]-x[v])*(x[u]-x[v])+
                    (y[u]-y[v])*(y[u]-y[v]));
    }
    int Find(int x){
        if(fa[x]== -1)return x;
        else return fa[x]=Find(fa[x]);
    }
    bool cmp(Edge a,Edge b){
      return a.value<b.value;
    }
    int main()
    {
        n=0,tot=0;
        scanf("%d%d",&m,&n);
        for(int i=1;i<=n;i++)
          scanf("%d%d",&y[i],&x[i]);
          
        //memset(fa,-1,sizeof(fa));
        for(int i=1;i<n;i++)
            for(int j=i+1;j<=n;j++)
                e[++tot]=(Edge){i,j,GetDist(i,j)/2};
        for(int i=1;i<=n;i++){
            e[++tot]=(Edge){i,0,y[i]};
            e[++tot]=(Edge){i,n+1,m-y[i]};
        }
        sort(e+1,e+tot+1,cmp);
        memset(fa,-1,sizeof(fa));
        int cur=0;
        while(Find(0)!=Find(n+1)){
            cur++;
            int rx=Find(e[cur].from),ry=Find(e[cur].to);
            if(rx!=ry)fa[rx]=ry;
        }
        printf("%.2f
    ",e[cur].value);    
        return 0;
    }
  • 相关阅读:
    ubuntu高版本环境变量问题
    linux下可以和qq截屏比拟的工具hotshots
    如何以非 root 用户将应用绑定到 80 端口-ssh 篇
    mvn profile 深层次目录打参数核心配置
    java 判断字符串编码
    springmvc 传递和接收数组参数
    系统分层 manager层意义
    mysql insert中文乱码无法插入ERROR 1366 (HY000): Incorrect string value
    Apache Lens —— 统计数据分析查询接口
    云平台需要开发的底层功能
  • 原文地址:https://www.cnblogs.com/suishiguang/p/6441555.html
Copyright © 2011-2022 走看看