西南民族大学第十一届程序设计竞赛(同步赛)【金牌厨师HiLin与HJGG】预处理二维数组前缀和+二分

 

 思路:预处理出二维数组前缀和,然后二分即可。

 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 }
posted @ 2020-01-10 10:51  pengge666  阅读(210)  评论(0编辑  收藏  举报