2010上交:最小面积子矩阵

题目描述:

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

输入:

每个案例第一行三个正整数N,M<=100,表示矩阵大小,和一个整数K
接下来N行,每行M个数,表示矩阵每个元素的值

输出:

输出最小面积的值。如果出现任意矩阵的和都小于K,直接输出-1。

样例输入:
4 4 10
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
样例输出:
1
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=105;
int n,m,k;
int a[MAXN][MAXN];
int sum[MAXN][MAXN];
int area(int i,int j,int x,int y)
{
    return (x-i+1)*(y-j+1);
}
int main()
{
    while(scanf("%d%d%d",&n,&m,&k)!=EOF)
    {
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                scanf("%d",&a[i][j]);
        sum[1][1]=a[1][1];
        for(int i=2;i<=n;i++)
            sum[i][1]=sum[i-1][1]+a[i][1];
        for(int j=2;j<=m;j++)
            sum[1][j]=sum[1][j-1]+a[1][j];
        for(int i=2;i<=n;i++)
            for(int j=2;j<=m;j++)
                sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j];//sum[i][j]记录 左上角为a[1][1],右下角为a[i][j]的子矩阵之和

        int res=MAXN*MAXN;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                for(int x=i;x<=n;x++)
                    for(int y=j;y<=m;y++)
                    {
                        int z=sum[x][y]-sum[i-1][y]-sum[x][j-1]+sum[i-1][j-1];
                        if(z>=k)
                        {
                            res=min(res,area(i,j,x,y));
                        }
                    }

        if(res==MAXN*MAXN)
            printf("-1\n");
        else
            printf("%d\n",res);
    }

    return 0;
} 

时间: 2024-08-25 23:25:30

2010上交:最小面积子矩阵的相关文章

九度oj 题目1102:最小面积子矩阵

题目描述: 一个N*M的矩阵,找出这个矩阵中所有元素的和不小于K的面积最小的子矩阵(矩阵中元素个数为矩阵面积) 输入: 每个案例第一行三个正整数N,M<=100,表示矩阵大小,和一个整数K接下来N行,每行M个数,表示矩阵每个元素的值 输出: 输出最小面积的值.如果出现任意矩阵的和都小于K,直接输出-1. 样例输入: 4 4 10 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 样例输出: 1 这道题的题意读了半天才读懂,它是要求输出满足条件的最小的矩阵面积.解决这类

最小面积子矩阵

转自:https://blog.csdn.net/jaster_wisdom/article/details/52153685 题目描述 一个N*M的矩阵,找出这个矩阵中所有元素的和不小于K的面积最小的子矩阵(矩阵中元素个数为矩阵面积) 输入描述: 每个案例第一行三个正整数N,M<=100,表示矩阵大小,和一个整数K 接下来N行,每行M个数,表示矩阵每个元素的值 输出描述: 输出最小面积的值.如果出现任意矩阵的和都小于K,直接输出-1. 示例1 输入 复制 4 4 10 1 2 3 4 5 6

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

题目描述: 一个N*M的矩阵,找出这个矩阵中所有元素的和不小于K的面积最小的子矩阵(矩阵中元素个数为矩阵面积) 输入: 每个案例第一行三个正整数N,M<=100,表示矩阵大小,和一个整数K 接下来N行,每行M个数,表示矩阵每个元素的值 输出: 输出最小面积的值.如果出现任意矩阵的和都小于K,直接输出-1. 样例输入: 4 4 10 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 样例输出: 1 首先这个题应该是有一个动态规划的解法,不过好像复杂度也要到O(n^3lo

LeetCode939 最小面积矩形

LeetCode939最小面积矩形 给定在 xy 平面上的一组点,确定由这些点组成的矩形的最小面积,其中矩形的边平行于 x 轴和 y 轴. 如果没有任何矩形,就返回 0. Input [[1,1],[1,3],[3,1],[3,3],[2,2]] Output 4 hint 1 <= points.length <= 500 0 <= points[i][0] <= 40000 0 <= points[i][1] <= 40000 所有的点都是不同的. 题目大意 给许多

[Swift Weekly Contest 116]LeetCode963. 最小面积矩形 II | Minimum Area Rectangle II

Given a set of points in the xy-plane, determine the minimum area of any rectangle formed from these points, with sides not necessarily parallel to the x and y axes. If there isn't any rectangle, return 0. Example 1: Input: [[1,2],[2,1],[1,0],[0,1]]

2010上交:后缀子串排序

题目描述: 对于一个字符串,将其后缀子串进行排序,例如grain其子串有:grain rain ain in n 然后对各子串按字典顺序排序,即: ain,grain,in,n,rain 输入: 每个案例为一行字符串. 输出: 将子串排序输出 样例输入: grain 样例输出: ain grain in n rain #include<cstdio> #include<cstring> #include<algorithm> using namespace std; c

2010上交:最短路径

题目描述: N个城市,标号从0到N-1,M条道路,第K条道路(K从0开始)的长度为2^K,求编号为0的城市到其他城市的最短距离 输入: 第一行两个正整数N(2<=N<=100)M(M<=500),表示有N个城市,M条道路接下来M行两个整数,表示相连的两个城市的编号 输出: N-1行,表示0号城市到其他城市的最短路,如果无法到达,输出-1,数值太大的以MOD 100000 的结果输出. 样例输入: 4 4 1 2 2 3 1 3 0 1 样例输出: 8 9 11思路:long long 存

codeforces1c给出三点求面积

题意:有一个正n边形的斗兽场,现存有3根柱子,柱子位于正n边形的任意3个节点上.求出正n边形的最小面积. 1 #include <iostream> 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <math.h>//采用三角函数大部分使用弧度 5 #include <utility> 6 #include <algorithm> 7 using namespace std;

2014子矩阵

题目描述 Description 给出如下定义: 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与 列的相对顺序)被称为原矩阵的一个子矩阵.例如,下面左图中选取第 2.4 行和第 2.4.5 列交叉位置的元素得到一个 2*3 的子矩阵如右图所示. 相邻的元素:矩阵中的某个元素与其上下左右四个元素(如果存在的话)是相邻的. 矩阵的分值:矩阵中每一对相邻元素之差的绝对值之和. 本题任务:给定一个 n 行 m 列的正整数矩阵,请你从这个矩阵中选出一个 r 行 c 列的 子矩阵,