P2658 汽车拉力比赛
2018-06-17 22:23:08来源:未知 阅读 ()
题目描述
博艾市将要举行一场汽车拉力比赛。
赛场凹凸不平,所以被描述为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。
输入输出样例
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
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 }
感觉整个世界都非常美好,。,,,
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:容器assign
下一篇:c++ transform
- 你知道汽车租赁系统的关键点吗? 2018-06-18
- 汽车租赁系统 2018-06-18
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash