zoukankan      html  css  js  c++  java
  • P2658 汽车拉力比赛

    题目描述

    博艾市将要举行一场汽车拉力比赛。

    赛场凹凸不平,所以被描述为M*N的网格来表示海拔高度(1≤ M,N ≤500),每个单元格的海拔范围在0到10^9之间。

    其中一些单元格被定义为路标。组织者希望给整个路线指定一个难度系数D,这样参赛选手从任一路标到达别的路标所经过的路径上相邻单元格的海拔高度差不会大于D。也就是说这个难度系数D指的是保证所有路标相互可达的最小值。任一单元格和其东西南北四个方向上的单元格都是相邻的。

    输入输出格式

    输入格式:

    第一行两个整数M和N。第2行到第M+1行,每行N个整数描述海拔高度。第2+M行到第1+2M

    行,每行N个整数,每个数非0即1,1表示该单元格是一个路标。

    输出格式:

    一个整数,即赛道的难度系数D。

    输入输出样例

    输入样例#1:
    3 5 
    20 21 18 99 5  
    19 22 20 16 26
    18 17 40 60 80
    1 0 0 0 1
    0 0 0 0 0
    0 0 0 0 1
    输出样例#1:
    2
    我必须要说说今天这个错误,我为了处理边界,给了周边的单元一个极小值,但负小了,所以就抄了边界。
    !!!!注意
    #include<iostream>
    #include<cstdio>
    #include<string.h>
    #include<algorithm>
    #include<math.h>
    using namespace std;
    int n,m,L,R,mid;
    long long  h[600][600];
    int X,Y,cnt;
    bool map[600][600];
    int zh[9000009][2],vis[600][600];
    int dx[4]={0,-1,1,0},dy[4]={1,0,0,-1};
    bool check(int d)
    {
        memset(vis,0,sizeof(vis));
        int l=0,r=1,x,y,xx,yy,tot=cnt-1;
        l=0,r=1;
        zh[r][0]=X,zh[r][1]=Y;vis[X][Y]=1;
        while(l < r)
        {
            x=zh[++l][0],y=zh[l][1];
            for(int j=0;j<4;j++)
            {    if(tot==0)    return 1;
                xx=x+dx[j],yy=y+dy[j];
                if(abs(h[xx][yy]-h[x][y]) <=d && (!vis[xx][yy])&&x>=1&&x<=m&&y>=1&&y<=n)
                {
                    zh[++r][0]=xx;zh[r][1]=yy;    vis[xx][yy]=1;                            
                    if(map[xx][yy])
                        tot--;
                }
            }
        }    
        
        return 0;
    }
    int main()
    {
        scanf("%d%d",&m,&n);long long  mi=99999999,ma=0;
        for(int i=1;i<=m;i++)
        for(int j=1;j<=n;j++)
        {
            scanf("%lld",&h[i][j]);
            mi=min(mi,h[i][j]);
            ma=max(ma,h[i][j]);
        }
        
        for(int i=1;i<=m;i++)
        for(int j=1;j<=n;j++)    
        {
            scanf("%d",&map[i][j]);
            if(map[i][j]) 
                X=i,Y=j,cnt++;
        }
        for(int i=0;i<=m+1;i++)    h[i][0]=h[i][n+1]=-999999999;
        for(int j=0;j<=n+1;j++)    h[0][j]=h[m+1][j]=-999999999;
        L=0,R=ma-mi;//+100
        while(L+2<R)
        {
            mid=(L+R)/2;
            if(check(mid))
                R=mid;
            else L=mid;
        }
        for(L;L<=R;L++)
        if(check(L)){
            cout<<L;
            return 0;
        }
        cout<<L;
        return 0;
    }
  • 相关阅读:
    Web网站架构演变—高并发、大数据
    企业级Nginx Web服务优化实战
    初始化mysql数据库时提示字符编码错误的解决办法
    linux下logrotate 配置和理解
    Centos 5.2下安装多个mysql数据库
    编译安装 mysql 5.5,运行 cmake报错Curses library not found
    Centos 5.5 编译安装mysql 5.5.9
    理解索引的基数
    centos下yum安装mysql5.6后,无法启动 MySQL Daemon failed to start
    如何从MySQL官方Yum仓库安装MySQL5.6
  • 原文地址:https://www.cnblogs.com/CLGYPYJ/p/7340166.html
Copyright © 2011-2022 走看看