您的位置:首页 > 其它

玄学啊

2016-06-20 19:34 302 查看
时间: 1000ms / 空间: 131072KiB / Java类名: Main


描述

我们定义一个矩阵的权值为这个矩阵四个角上的数值的最小值。现在小M有一个矩阵,他想在这个矩阵中寻找到一个权值最大的子矩阵,请你告诉他这个最大权值。


输入格式

第一行两个数n m

接下来一个n*m的矩阵


输出格式

一个数表示最大权值


备注

matrix.in
matrix.out
3 3

1 0 1

0 1 0

0 1 1

0
样例解释

可以发现无论选择哪个子矩阵四角都至少有一个0.

 

10%的数据满足 n,m<=50

30%的数据满足 n,m<=200

100%的数据满足 n,m<=2000

所有的数值不超过10^9

据说有n^2的做法,但是感觉加个二分log一下也不会怎么样,于是就写了一下 挺简单的样子,思路其实一看就懂了。。。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#define inf 1e9
using namespace std;
int a[2005][2005];
bool flag[2005][2005];
int n,m;
int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
bool pd(int mid)
{  for(int x=1;x<=n;x++)
{ for(int i=1;i<=m;i++)
if(a[x][i]>=mid)
{ for(int j=i+1;j<=m;j++)
{if(a[x][j]>=mid)
{if(flag[i][j]==1) return 1;
else flag[i][j]=1;
}
}
}
}
return 0;
}
int main()
{cin>>n>>m;

for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{ int x=read();
a[i][j]=x;
}
}

int l=0,r=inf;
while(r-l>1)
{
int mid=(l+r)>>1;
if(pd(mid)==true)
{l=mid;
}
else
r=mid;
memset(flag,0,sizeof(flag));

}
if(pd(r)==true) cout<<r;
else       cout<<l;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: