西南民族大学第十一届程序设计竞赛 L.金牌厨师HiLin与HJGG
题目描述
(略)
输入描述:
(略)
输出描述:
如果能找到满足条件的答案,输出这个矩阵的阶数m,如果没有能满足HJGG要求的矩阵,HiLin也不会吃了,并表示自己是金牌厨师,自己做饭吃,输出:“I’m a Gold Chef!”(不包括引号)
示例1
输入
3 5
1 2 3
4 5 6
7 8 9
输出
1
示例2
输入
3 5
1 0 0
0 4 0
0 0 0
输出
2
示例3
输入
1 2
1
输出
I'm a Gold Chef!
比赛时没有想到二分,现在来补一下……
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define maxn 2005
ll a[maxn][maxn],k;
int n;
void init(){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
a[i][j]+=a[i][j-1]+a[i-1][j]-a[i-1][j-1];
}
}
}
bool judge(int x){
for(int i=x;i<=n;i++){
for(int j=x;j<=n;j++){
if((a[i][j]-a[i-x][j]-a[i][j-x]+a[i-x][j-x])>=k) {
return 1;
}
}
}
return 0;
}
int main()
{
cin>>n>>k;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%lld",&a[i][j]);
}
}
init();
int l=1,r=n,ans=0;
while(l<=r){
int mid=r+l>>1;
if(judge(mid)){
ans=mid;
r=mid-1;
}
else l=mid+1;
}
if(ans) cout<<ans;
else cout<<"I'm a Gold Chef!";
return 0;
}