玄学啊
2016-06-20 19:34
302 查看
时间: 1000ms / 空间: 131072KiB / Java类名: Main
我们定义一个矩阵的权值为这个矩阵四个角上的数值的最小值。现在小M有一个矩阵,他想在这个矩阵中寻找到一个权值最大的子矩阵,请你告诉他这个最大权值。
第一行两个数n m
接下来一个n*m的矩阵
一个数表示最大权值
【样例解释】
可以发现无论选择哪个子矩阵四角都至少有一个0.
10%的数据满足 n,m<=50
30%的数据满足 n,m<=200
100%的数据满足 n,m<=2000
所有的数值不超过10^9
据说有n^2的做法,但是感觉加个二分log一下也不会怎么样,于是就写了一下 挺简单的样子,思路其实一看就懂了。。。
描述
我们定义一个矩阵的权值为这个矩阵四个角上的数值的最小值。现在小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; }
相关文章推荐
- Android开发笔记(十)TimePiker的使用方法
- 【C++】泛型编程基础:模板通识
- Redis源码解析:25集群(一)握手、心跳消息以及下线检测
- Oracle中的NVL函数
- spring boot 第二课-完成单表操作及分页查询
- PostSharp AOP
- 【iOS】App Transport Security
- 红烧萝卜
- 分步骤实现操作
- 2-1什么是变量
- 树形dp--清洁机器人 nkoj3695
- 枚举把值放到map里
- [置顶] Unity中通过场景切换但音乐继续播放
- 洋葱炒肉
- gson转换list对象
- Single Number
- RtlZeroMemory
- 图描述之:流程图
- HDU 1269 迷宫城堡
- 装饰者模式 详解