每个案例第一行三个正整数N,M<=100,表示矩阵大小,和一个整数K 接下来N行,每行M个数,表示矩阵每个元素的值
输出最小面积的值。如果出现任意矩阵的和都小于K,直接输出-1。
链接:https://www.nowcoder.com/questionTerminal/8ef506fbab2742809564e1a288358554 来源:牛客网 #include<iostream> #include<cstring> using namespace std; int matrix[110][110]; int num[110]; int N,M; int k; void merge(int i,int j){ for(int p=0;p<N;p++){ for(int k=i;k<=j;k++){ num[p]+=matrix[p][k];//合并成一维数组 } } } int findShortest(){ int start=0,end=0; int sum=0; int len=N; int ans=len+1; bool flag=false; while(end<len){ if(sum<k){ sum+=num[end]; } while(sum>=k){ flag=true; ans=min(ans,end-start+1); sum-=num[start++]; } end++; } if(flag) return ans; else return N*M;//全部加起来值没超过k } int main(){ while(cin>>N>>M){ cin>>k; int sum=0; for(int i=0;i<N;i++){ for(int j=0;j<M;j++){ cin>>matrix[i][j]; sum+=matrix[i][j]; } } if(sum<k) cout<<-1<<endl; else{ int min_element=N*M; for(int i=0;i<M;i++){ for(int j=i;j<M;j++){ memset(num,0,sizeof(num)); merge(i,j); int temp=findShortest(); temp=(j-i+1)*temp; if(temp<min_element) min_element=temp; } } cout<<min_element<<endl; } } return 0; }
原文:https://www.cnblogs.com/JAYPARK/p/10353190.html