
思路:预处理出二维数组前缀和,然后二分即可。
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 }
来源:https://www.cnblogs.com/pengge666/p/12175047.html