19-10-25-G-悲伤

此题未通过 [ 老帅哥 ] 认证。

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;
}

T2

T3

原文地址:https://www.cnblogs.com/kalginamiemeng/p/Exam20191025.html