地址:https://ac.nowcoder.com/acm/contest/3570/L
思路:二维前缀和+二分查找,首先预处理出前a[i][j]的和,在利用二分查找答案即可
Code:
#include<iostream>
#include<algorithm>
using namespace std;
typedef pair<double,double> pr;
typedef long long LL;
const int MAX_N=2e3+5;
int n,m,T;
LL a[MAX_N][MAX_N];
bool judge(int k){
LL Max=0;
for(int i=k;i<=n;++i)
for(int j=k;j<=n;++j)
Max=max(Max,a[i][j]-a[i-k][j]-a[i][j-k]+a[i-k][j-k]);
return (Max>=m);
}
int main()
{
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
{
cin>>a[i][j];
a[i][j]+=a[i-1][j]+a[i][j-1]-a[i-1][j-1];
}
int res=0;
int l=1,r=n,h;
if(a[n][n]<m) res=r=-1;
while(l<=r){
h=(l+r)/2;
if(judge(h)) r=h-1;
else l=h+1;
}
if(res!=-1) cout<<l<<endl;
else cout<<"I'm a Gold Chef!"<<endl;
return 0;
}
来源:CSDN
作者:z岁月无声
链接:https://blog.csdn.net/C_13579/article/details/103756846