nyoj306 二分搜索

以前没有写过二分搜索,只知道二分快些但是不知道在搜索在二分是怎么快的,我想我要自己想的可能想不出来的。。。发现自己最近都没有怎么做出来题啊!

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<stack>
#include<vector>
#include<climits>
#include<map>
using namespace std;
#define rep(i,n) for(int i=0; i<n; i++)
#define repf(i,n,m) for(int i=(n); i<=(m); ++i)
#define repd(i,n,m) for(int i=(n); i>=(m); --i)
#define max(a,b) (a)>(b)?(a):(b)
#define min(a,b) (a)<(b)?(a):(b)
#define fab(a) ((a)>0?(a):(0-(a)))
#define ll long long
#define arc(a) ((a)*(a))
#define inf 100000
#define exp 0.000001
#define N  105
int a[N][N];
bool vis[N][N];
int sign;
int flag[4][2]={-1,0,1,0,0,-1,0,1};
int n;
void dfs(int x,int y,int l,int r)
{
	if(x==n && y==n)
	{
		sign=1;
		return ;
	}
	rep(i,4)
	{
		if(sign==1)
			return ;
		int xx=flag[i][0]+x;
		int yy=y+flag[i][1];
		if(xx<1|| xx>n || yy<1||yy>n|| a[xx][yy]<l || a[xx][yy]>r || vis[xx][yy]==true)
			continue;
		vis[xx][yy]=true;
		dfs(xx,yy,l,r);
	//	vis[xx][yy]=false;
	}
}
int main()
{ 
	while(~scanf("%d",&n))
	{
		int Max=0,Min=inf;
		repf(i,1,n)
			repf(j,1,n)
			{
				scanf("%d",&a[i][j]);
				Max=max(Max,a[i][j]);
				Min=min(Min,a[i][j]);
			}
		int l=0,r=Max-Min;
		
		while(l<=r)
		{
			sign=0;
                        int mid=(l+r)/2;
			repf(i,Min,Max-mid)
			{
				if(a[1][1]<i || a[1][1]>i+mid)
					continue;
				if(a[n][n]<i || a[n][n]>i+mid)
					continue;
				vis[1][1]=true;
				memset(vis,false,sizeof(vis));
                		dfs(1,1,i,i+mid);
				if(sign==1)
					break;
			}
			if(sign==1)
				r=mid-1;
			else
				l=mid+1;
		}
		printf("%d\n",l);
	}
	   return 0;
}
  


你可能感兴趣的:(nyoj306 二分搜索)