思路:预处理出二维数组前缀和,然后二分即可。
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define int long long 4 #define inf 0x3f3f3f3f3f 5 #define N 6666 6 int mp[N][N]; 7 int sum[N][N];//二维数组前缀和· 8 int n,k; 9 int check(int m){ 10 int f=0; 11 for(int i=m;i<=n;i++){ 12 for(int j=m;j<=n;j++){ 13 int temp=sum[i][j]-sum[i-m][j]-sum[i][j-m]+sum[i-m][j-m]; 14 if(temp>=k){ 15 f=1; 16 break; 17 } 18 } 19 if(f){ 20 break; 21 } 22 } 23 return f; 24 } 25 signed main(){ 26 cin>>n>>k; 27 for(int i=1;i<=n;i++) 28 for(int j=1;j<=n;j++) 29 scanf("%lld",&mp[i][j]); 30 for(int i=1;i<=n;i++){ 31 for(int j=1;j<=n;j++){ 32 sum[i][j]=mp[i][j]+sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]; 33 } 34 } 35 int l=0; 36 int r=n; 37 int ans=n+1; 38 while(l<=r){ 39 int mid=(l+r)/2; 40 if(check(mid)){ 41 r=mid-1; 42 ans=min(ans,mid); 43 }else{ 44 l=mid+1; 45 } 46 } 47 48 if(ans==n+1){ 49 cout<<"I'm a Gold Chef!"; 50 }else{ 51 cout<<ans; 52 } 53 return 0; 54 }