此题未通过 [ 老帅哥 ] 认证。
ZJ一下:
T1,明显是二分答案+$dij/SPFA$
T2,没看懂题。
T3,打了一个$Theta(N^2)$暴力。
事实上……
T1,T2死了。
T1中
每次可以向上下左右四个方向走一格,走一格用时1 秒。
你有一个机器,使得每次在上下移动一步时,用时为k 秒。
你确定向上下不可以走么(一定要用机器???)
明明可以向上下左右四个方向走一格,走一格用时1秒
不管了,语文问题。
最后在作者××巨佬的自动防AK系统的作用下。
47
|
Miemeng | 0
02:58:59
|
0
02:58:59
|
30
02:59:00
|
30
02:59:00
|
我祝福你,作者
%%%ZZD
nmsl
题解:
T1
一大句话题意:
有一个网格图,有格子不能走,向上下走需要$k$秒,向左右走需要$1$秒,问从$(x1,y1)$到$(x2,y2)$的最短时间为$s$时$k$的值。
#include <iostream> #include <cstring> #include <cstdio> #include <queue> #define LF double #define N 111 using namespace std; const LF eps=1e-5; int mp[N][N]; int lines,cols; int stx,sty,fix,fiy; LF targ,dis[N][N]; bool is_v[N][N]; struct POINT{ int x,y; double dis; POINT(){} POINT(int a,int b,double c):x(a),y(b),dis(c){} friend bool operator > (const POINT &a,const POINT &b){ return a.dis>b.dis; } }; priority_queue<POINT,vector<POINT>,greater<POINT> >q; inline bool inmp(int x,int y){ return x>=1&&x<=lines&&y>=1&&y<=cols&&mp[x][y]==0; } LF check(LF ud){ memset(is_v,0,sizeof is_v); for(int i=1;i<=lines;i++) for(int j=1;j<=cols;j++) dis[i][j]=1e10; dis[stx][sty]=0; q.push(POINT(stx,sty,0.0)); while(!q.empty()){ int fx=q.top().x,fy=q.top().y; // cout<<fx<<" "<<fy<<" "<<mp[fx][fy]<<" "<<dis[fx][fy]<<endl; q.pop(); if(is_v[fx][fy])continue; is_v[fx][fy]=1; if(inmp(fx+1,fy)&&dis[fx+1][fy]>dis[fx][fy]+ud){//puts("A"); dis[fx+1][fy]=dis[fx][fy]+ud; q.push(POINT(fx+1,fy,dis[fx+1][fy])); } if(inmp(fx-1,fy)&&dis[fx-1][fy]>dis[fx][fy]+ud){//puts("B"); dis[fx-1][fy]=dis[fx][fy]+ud; q.push(POINT(fx-1,fy,dis[fx-1][fy])); } if(inmp(fx,fy+1)&&dis[fx][fy+1]>dis[fx][fy]+1.0){//puts("C"); dis[fx][fy+1]=dis[fx][fy]+1.0; q.push(POINT(fx,fy+1,dis[fx][fy+1])); } if(inmp(fx,fy-1)&&dis[fx][fy-1]>dis[fx][fy]+1.0){//puts("D"); dis[fx][fy-1]=dis[fx][fy]+1.0; q.push(POINT(fx,fy-1,dis[fx][fy-1])); } } return dis[fix][fiy]; } int main(){ // freopen("1.in" ,"r",stdin); // freopen("maze.in" ,"r",stdin); freopen("maze.out","w",stdout); scanf("%d%d%d%d%d%d",&lines,&cols,&stx,&sty,&fix,&fiy); for(int i=1;i<=lines;i++) for(int j=1;j<=cols;j++) scanf("%d",&mp[i][j]); scanf("%lf",&targ); LF l=0,r=lines*cols; while(r-l>eps){ LF mid=(l+r)/2; // cout<<l<<" "<<r<<" "<<check(mid)<<endl; if(check(mid)>targ) r=mid; else l=mid; } printf("%.3lf ",l); // cout<<clock()<<endl; }