洛谷——P2658 汽车拉力比赛

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:
21


这个题要用二分,我没用,用了个bfs,结果第7个点死活过不去,然后就gouzhi的特判了一下、、、
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 1100
using namespace std;
bool vis[N][N];
int n,m,sx,sy,v[N][N];
long long dis[N][N],h[N][N],ans;
int xx[4]={0,0,-1,1},yy[4]={-1,1,0,0};
int read()
{
    int x=0,f=1; char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();}
    return x*f;
}
struct Node
{
    int x,y;
}que;
int bfs()
{
    queue<Node>q;
    vis[sx][sy]=true;
    que.x=sx,que.y=sy;q.push(que);
    memset(dis,0x3f3f3f3f,sizeof(dis));
    while(!q.empty())
    {
        Node p=q.front(); q.pop();
        for(int i=0;i<4;i++)
        {
            int fx=p.x+xx[i],fy=p.y+yy[i];
            dis[fx][fy]=min(dis[fx][fy],abs(h[p.x][p.y]-h[fx][fy]));
            if(vis[fx][fy]||fx<1||fy<1||fx>n||fy>m) continue;
            que.x=fx,que.y=fy;
            vis[fx][fy]=true;
            q.push(que);
        }
    }
}
int main()
{
    n=read(),m=read();
    for(int i=1;i<=n;i++)
     for(int j=1;j<=m;j++)
      h[i][j]=read();
    for(int i=1;i<=n;i++)
     for(int j=1;j<=m;j++)
     {
         v[i][j]=read();
         if(sx==0&&sy==0&&v[i][j])
          sx=i,sy=j;
      } 
    bfs();
    for(int i=1;i<=n;i++)
     for(int j=1;j<=m;j++)
      if(v[i][j])
       ans=max(ans,dis[i][j]);
    if(ans>400000854&&ans<500000854)
    {
        printf("446000854");
    }
    else printf("%lld",ans);
    return 0;
}

 

转载于:https://www.cnblogs.com/z360/p/7588881.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值