牛客网——最小面积子矩阵

题目描述

一个N*M的矩阵,找出这个矩阵中所有元素的和不小于K的面积最小的子矩阵(矩阵中元素个数为矩阵面积)

输入描述:

每个案例第一行三个正整数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;
}

猜你喜欢

转载自www.cnblogs.com/JAYPARK/p/10353190.html