这题真不错。
就是给你一个矩形,让你找到其中最大的一个边长为L正方形,其中所有的所有都大于等于L。
首先咱确定vector[n],因为二维数组开不了那么大。
求最大,尺取!
那如何动态的去看是否有这么一个正方形呢?我们设置双数组就及时截取就好了(满足则++,否则归零),详情见代码:
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<string.h>
#include<map>
#include<string>
#include<set>
#include<vector>
#include<limits>
#define ll long long
using namespace std;
int a[1000005];
vector<int>k[1000005];
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int T;
cin >> T;
while (T--)
{
int x, y;
cin >> x >> y;
for (int i = 1; i <= x; i++)
{
k[i].clear();
k[i].push_back(0);
for (int j = 1; j <= y; j++)
{
int g;
cin >> g;
k[i].push_back(g);
}
}
int l=1,r=x, mid;
while (l<=r)
{
memset(a, 0, sizeof(a));//清零
mid = (l + r) / 2;
bool ff = false;
for (int i = 1; i <= x; i++)
{
for (int j = 1; j <= y; j++)
{
if (k[i][j] >= mid)//横向截取
{
a[j]++;
}
else
{
a[j] = 0;
}
}
int cnt = 0;
for (int j = 1; j <= y; j++)
{
if (a[j] >= mid)//竖向截取
{
cnt++;
}
else
{
cnt = 0;
}
if (cnt == mid)
{
ff = true;
break;
}
}
if (ff)
{
break;
}
}
if (ff)
{
l = mid + 1;
}
else
{
r = mid - 1;
}
}
cout << r << "\n";
}
return 0;
}
记得开加速。