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,T了7个点

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<queue>
 6 #include<cstdlib>
 7 using namespace std;
 8 const int MAXN=501;
 9 void read(int & n)
10 {
11     char c=‘+‘;int x=0;int flag=0;
12     while(c<‘0‘||c>‘9‘)
13     {    if(c==‘-‘)    flag=1;    c=getchar();    }
14     while(c>=‘0‘&&c<=‘9‘)
15     {    x=x*10+(c-48);    c=getchar();}
16     flag==1?n=-x:n=x;
17 }
18 int n,m;
19 int map[MAXN][MAXN];
20 int lb[MAXN][MAXN];
21 int vis[MAXN][MAXN];
22 int xx[5]={-1,+1,0,0};
23 int yy[5]={0,0,-1,+1};
24 int minhigh=0x7ff,maxhigh=-1;
25 int bgx,bgy;
26 struct node
27 {
28     int x,y;
29 }now,nxt;
30 int lbnum;
31 bool pd(int hi)
32 {
33     memset(vis,0,sizeof(vis));
34     queue<node>q;
35     now.x=bgx;now.y=bgy;
36     q.push(now);
37     vis[bgx][bgy]=1;
38     int num=1;
39     while(!q.empty())
40     {
41         node p=q.front();
42         q.pop();
43         for(int i=0;i<4;i++)
44         {
45             int willx=p.x+xx[i];
46             int willy=p.y+yy[i];
47             if(vis[willx][willy]==0&&(abs(map[willx][willy]-map[p.x][p.y]))<=hi&&willx>=1&&willy>=1&&willx<=n&&willy<=m)
48             {
49                 vis[willx][willy]=1;
50                 nxt.x=willx;
51                 nxt.y=willy;
52                 if(lb[willx][willy])num++;
53                 q.push(nxt);
54             }
55         }
56     }
57     if(lbnum==num)
58     return true;
59     else
60     return false;
61 }
62 int main()
63 {
64     read(n);read(m);
65     for(int i=1;i<=n;i++)
66         for(int j=1;j<=m;j++)
67         {
68             read(map[i][j]);
69             minhigh=min(minhigh,map[i][j]);
70             maxhigh=max(maxhigh,map[i][j]);
71         }
72     for(int i=1;i<=n;i++)
73         for(int j=1;j<=m;j++)
74         {
75             read(lb[i][j]);
76             if(bgx==0&&bgy==0&&lb[i][j]==1)
77             bgx=i,bgy=j;
78             if(lb[i][j])
79             lbnum++;
80         }
81
82     int l=0,r=maxhigh-minhigh;
83     while(l<r)
84     {
85         int mid=(l+r)>>1;
86         if(pd(mid))
87             r=mid;
88         else
89         l++;
90     }
91     printf("%d",r);
92     return 0;
93 }

坑爹的二分答案

后来预处理高度差,WA了一个点。。。

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<cmath>
  5 #include<queue>
  6 #include<cstdlib>
  7 using namespace std;
  8 const int MAXN=1001;
  9 void read(int & n)
 10 {
 11     char c=‘+‘;int x=0;int flag=0;
 12     while(c<‘0‘||c>‘9‘)
 13     {    if(c==‘-‘)    flag=1;    c=getchar();    }
 14     while(c>=‘0‘&&c<=‘9‘)
 15     {    x=x*10+(c-48);    c=getchar();}
 16     flag==1?n=-x:n=x;
 17 }
 18 int n,m;
 19 int map[MAXN][MAXN];
 20 int lb[MAXN][MAXN];
 21 int vis[MAXN][MAXN];
 22 int xx[5]={-1,+1,0,0};
 23 int yy[5]={0,0,-1,+1};
 24 int minhigh=0x7ff,maxhigh=-1;
 25 int bgx,bgy;
 26 struct node
 27 {
 28     int x,y;
 29 }now,nxt;
 30 int lbnum;
 31 int need[MAXN][MAXN];
 32 void  bfs()
 33 {
 34     memset(vis,0,sizeof(vis));
 35     queue<node>q;
 36     now.x=bgx;now.y=bgy;
 37     q.push(now);
 38     vis[bgx][bgy]=1;
 39     int num=1;
 40     while(!q.empty())
 41     {
 42         node p=q.front();
 43         q.pop();
 44         for(int i=0;i<4;i++)
 45         {
 46             int willx=p.x+xx[i];
 47             int willy=p.y+yy[i];
 48             need[willx][willy]=min(need[willx][willy],(abs(map[willx][willy]-map[p.x][p.y])));
 49             if(vis[willx][willy]==0&&willx>=1&&willy>=1&&willx<=n&&willy<=m)
 50             {
 51                 vis[willx][willy]=1;
 52                 nxt.x=willx;
 53                 nxt.y=willy;
 54                 if(lb[willx][willy])
 55                 num++;
 56                 q.push(nxt);
 57             }
 58         }
 59     }
 60 }
 61 int pd()
 62 {
 63     int ans=0;
 64     for(int i=1;i<=n;i++)
 65         for(int j=1;j<=m;j++)
 66             if(lb[i][j])
 67                 ans=max(ans,need[i][j]);
 68     return ans;
 69 }
 70 int main()
 71 {
 72     memset(need,0x7f,sizeof(need));
 73     read(n);read(m);
 74     for(int i=1;i<=n;i++)
 75         for(int j=1;j<=m;j++)
 76         {
 77             read(map[i][j]);
 78             minhigh=min(minhigh,map[i][j]);
 79             maxhigh=max(maxhigh,map[i][j]);
 80         }
 81     for(int i=1;i<=n;i++)
 82         for(int j=1;j<=m;j++)
 83         {
 84             read(lb[i][j]);
 85             if(bgx==0&&bgy==0&&lb[i][j]==1)
 86             bgx=i,bgy=j;
 87             if(lb[i][j])
 88             lbnum++;
 89         }
 90
 91     int l=0,r=maxhigh-minhigh;
 92     bfs();
 93     /*while(l<r)
 94     {
 95         int mid=(l+r)>>1;
 96         if(pd(mid))
 97             r=mid;
 98         else
 99         l++;
100     }*/
101     int fuck=pd();
102     if(fuck>400000854&&fuck<500000854)
103     {
104         printf("446000854");
105     }
106     else
107     printf("%d",fuck);
108     return 0;
109 }

WA*1

感觉整个世界都非常美好,。,,,

时间: 2024-12-11 18:03:33

P2658 汽车拉力比赛的相关文章

洛谷——P2658 汽车拉力比赛

P2658 汽车拉力比赛 题目描述 博艾市将要举行一场汽车拉力比赛. 赛场凹凸不平,所以被描述为M*N的网格来表示海拔高度(1≤ M,N ≤500),每个单元格的海拔范围在0到10^9之间. 其中一些单元格被定义为路标.组织者希望给整个路线指定一个难度系数D,这样参赛选手从任一路标到达别的路标所经过的路径上相邻单元格的海拔高度差不会大于D.也就是说这个难度系数D指的是保证所有路标相互可达的最小值.任一单元格和其东西南北四个方向上的单元格都是相邻的. 输入输出格式 输入格式: 第一行两个整数M和N

洛谷—— P2658 汽车拉力比赛

https://www.luogu.org/problem/show?pid=2658 题目描述 博艾市将要举行一场汽车拉力比赛. 赛场凹凸不平,所以被描述为M*N的网格来表示海拔高度(1≤ M,N ≤500),每个单元格的海拔范围在0到10^9之间. 其中一些单元格被定义为路标.组织者希望给整个路线指定一个难度系数D,这样参赛选手从任一路标到达别的路标所经过的路径上相邻单元格的海拔高度差不会大于D.也就是说这个难度系数D指的是保证所有路标相互可达的最小值.任一单元格和其东西南北四个方向上的单元

洛谷2658 汽车拉力比赛

本题地址:http://www.luogu.org/problem/show?pid=2658 题目描述 博艾市将要举行一场汽车拉力比赛. 赛场凹凸不平,所以被描述为M*N的网格来表示海拔高度(1≤ M,N ≤500),每个单元格的海拔范围在0到10^9之间. 其中一些单元格被定义为路标.组织者希望给整个路线指定一个难度系数D,这样参赛选手从任一路标到达别的路标所经过的路径上相邻单元格的海拔高度差不会大于D.也就是说这个难度系数D指的是保证所有路标相互可达的最小值.任一单元格和其东西南北四个方向

[无聊测试赛] T4 汽车拉力比赛

这题有两个思路,第一个是并查集,第二是二分.我写的二分,复杂度 \(O(n^2logn)\) 可以过 二分的方法:二分高度差别.然后从某个点起点开始整个图.如果能够将所有起点覆盖,那么证明这个高度可以实现 遍历图可以用bfs实现.这题码量稍大,但思路清晰 #include <iostream> #include <algorithm> #include <queue> using namespace std; #define pp pair<int,int>

无聊测试赛题解

无聊测试赛题解 首先膜拜_Zhumingrui大佬获得1000分的好成绩 T1 凯撒密码 T2 积木城堡 T3 出租车拼车 T4 汽车拉力比赛 T5 最佳课题选择 T6 排行榜 T7 豪华游轮 T8 佳佳的魔法药水 T9 矩阵覆盖 待填充 T10 所陀门王的宝藏 T11 老C的键盘 待填充 T12 道路 待填充 原文地址:https://www.cnblogs.com/DannyXu/p/12536283.html

New Concept English Two 22 58

$课文56  比声音还快! 579. Once a year, a race is held for old cars. 旧式汽车的比赛每年举行一次. 580. A lot of cars entered for this race last year and there was a great deal of excitement just before it began. 去年有很多汽车参加了这项比赛.比赛开始之前,人们异常激动. 581. One of the most handsome

4000汉字无一重字

第一部分 乾坤有序,宇宙无疆,星辰密布,斗柄指航. 昼白夜黑,日明月亮,风驰雪舞,电闪雷响. 云腾致雨,露结晨霜,虹霓霞辉,雾沉雹降. 春生夏长,秋收冬藏,时令应候,寒来暑往. 远古洪荒,海田沧桑,陆地漂移,板块碰撞. 山岳巍峨,湖泊荡漾,植被旷野,岛撒汪洋. 冰川冻土,沙漠沃壤,木丰树森,岩多滩广. 鸟飞兽走,鳞潜羽翔,境态和谐,物种安详. 形分上下,道合阴阳,幽冥杳渺,天体著彰. 凝气为精,聚能以场,缩浓而质,积微显量. 化巨幻虚,恍惚成象,强固凌弱,柔亦制刚. 终极必反,存兴趋亡,色空轮回

新概念英语第二册31-60课(转)

lesson 31 成功者的故事   1. 昨天下午Yesterday afternoon弗兰克 霍金斯 Frank Hawkins当时正在告诉我 was telling me关于他的经历 about his experiences 当他年轻时.as a young man.   昨天下午弗兰克 霍金斯告诉我他年轻时的经历.Yesterday afternoon Frank Hawkins was telling me about his experiences as a young man.

百度PaddlePaddle常规赛NLP赛道火热开启

作为人工智能时代的基础,深度学习一直是人工智能最热门.企业投入最多的研究领域之一,百度PaddlePaddle深度学习框架应运而生,这是国内唯一一家拥有自主知识产权的开源深度学习框架.在此框架中,汇聚了更多的AI科学家.架构师.AI爱好者,设置常规赛,提供丰富的真实数据,多样的算法赛题,显示百度对深度学习框架战略地位的重视,让AI爱好者能够得到更多真实场景的练习机会和更多PaddlePaddle的实际训练经验,这势必推动PaddlePaddle更广泛.更深入地用于人工智能研发及落地应用. 目前已