题目戳这里

一句话题意

给你一个a×b的矩形,求一个n×n的子矩阵,矩阵里面的最大值和最小值之差最小。

Solution

这个题目许多大佬都是单调队列,但是我不是很会,只好用了比较傻逼的方法:

首先我们预处理出每个点往后走N步的最大值和最小值。复杂度的话是\(O(a*b*n)\),然后枚举每一个点,往下走N步并比较最大值和最小值,就得到一个N×N的矩阵中的最大值和最小值,然后更新答案即可。

复杂度大概是 1e8,差不多正好卡过去。洛谷评测机是真的快,开氧气优化居然只要200ms

Coding

#include<bits/stdc++.h>
using namespace std;
const int N = 2005;
int n,a,b,Map[N][N],Max[N][N],Min[N][N],ans=1e9+5;
inline int read()
{
int X=0,w=1; char ch=0;
while(ch<'0' || ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar();
return X*w;
}
int main()
{
cin>>a>>b>>n;
for(int i=1;i<=a;++i)
for(int j=1;j<=b;++j)
Map[i][j]=read();
for(int i=1;i<=a;++i)
for(int j=1;j<=b-n+1;++j)
{
int Mx=0,Mi=1e9+5;
for(int k=0;k<n;++k)
{
Mx=max(Mx,Map[i][j+k]);
Mi=min(Mi,Map[i][j+k]);
}
Max[i][j]=Mx;
Min[i][j]=Mi;
}
for(int i=1;i<=a-n+1;++i)
for(int j=1;j<=b-n+1;++j)
{
int Mx=0,Mi=1e9+5;
for(int k=i;k<i+n;++k)
{
Mx=max(Mx,Max[k][j]);
Mi=min(Mi,Min[k][j]);
}
ans=min(Mx-Mi,ans);
}
cout<<ans;
return 0;
}

最新文章

  1. 【bzoj3573】[HNOI2014]米特运输
  2. 在Linux上配置无线网络
  3. Openvpn 本地密码验证
  4. 【html/css】html/css命名规范
  5. C/C++中产生随机数
  6. 返回json格式时间,解析时间
  7. 对于 Javascript 闭包理解
  8. 模拟游客一天的生活与旅游java程序代写源码
  9. ASP.NET返回Json数据
  10. C++课程设计类作业2
  11. 四、Attribute
  12. POJ 3974 Palindrome (算竞进阶习题)
  13. 作用域和闭包(二)this
  14. python day 25--正则表达式
  15. nginx的启动,停止和重启
  16. gridView 删除一行后自动定位到指定行
  17. CXF wsdl2java 生成java代码供客户端使用
  18. popen strtok 函数的使用
  19. python的N个小功能(文件内容的匹配替换)
  20. 简单安装与配置mysql数据库(绿色版)

热门文章

  1. Linux Ubuntu下Dropbox图标消失
  2. 在html页面中直接嵌入图片数据
  3. Angular 学习笔记——ng-Resource
  4. python——内置对象
  5. ES8新特性
  6. Android——点击对话框上button不关闭对话框
  7. jmeter压测-负载配置
  8. 最常用的几个python库--学习引导
  9. Linux中的一个命令行计算器bc简介
  10. 小技巧之Selenium如何切换到弹出的Tab页中