最近也写了些许题目吧,还是写写博客,捋捋思路。

P2216 [HAOI2007]理想的正方形

求一个$a \times b(a,b \leq 10^3)$的矩阵,求出一个$n \times n (n \leq 100)$的矩阵,设矩阵中元素最小值$Min$,最大值$Max$,

最小化$Max - Min$

Sol : 这个题事实上只需要暴力扫每个子矩阵即可。复杂度是$O(abn)$

预处理对点$(i,j)$的$ Max[i][j] = \max\limits_{k=i-n+1}^{i} a[k][j]$

枚举每个子矩阵的时候,求$(i,j)$为左下角的$n \times n$子矩阵的

$MAX=\max\limits_{k=j-n+1}^{j} Max[i][k]$而$MIN$的处理同理。

// luogu-judger-enable-o2
# include<bits/stdc++.h>
# define int long long
using namespace std;
const int N=1e3+10;
int w[N][N];
int Max[N][N],Min[N][N];
int a,b,n,ans=0x3f3f3f3f;
signed main()
{
    scanf("%lld%lld%lld",&a,&b,&n);
    for (int i=1;i<=a;i++)
     for (int j=1;j<=b;j++)
      scanf("%lld",&w[i][j]);
    memset(Max,-0x3f,sizeof(Max));
    memset(Min,0x3f,sizeof(Min));
    for (int i=1;i<=a;i++)
     for (int j=1;j<=b;j++) {
         if (j<n) continue;
         for (int k=j;k>=j-n+1;k--)
          Min[i][j]=min(Min[i][j],w[i][k]),
          Max[i][j]=max(Max[i][j],w[i][k]);
     }
    for (int i=1;i<=a;i++)
     for (int j=1;j<=b;j++) {
         int mi=0x3f3f3f3f,ma=-0x3f3f3f3f;
         if (i<n) continue;
         for (int k=i;k>=i-n+1;k--) 
          mi=min(mi,Min[k][j]),ma=max(ma,Max[k][j]);
         if (ma-mi<ans&&ma-mi>=0) ans=ma-mi;
    }  
    printf("%lld\n",ans);
    return 0;
 } 
P2216.cpp

相关文章:

  • 2021-12-09
  • 2022-12-23
  • 2022-12-23
  • 2022-01-06
  • 2021-06-27
  • 2022-03-07
  • 2021-07-29
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-09-25
  • 2022-12-23
  • 2022-12-23
  • 2021-11-03
  • 2021-09-28
  • 2021-07-14
相关资源
相似解决方案