zoukankan      html  css  js  c++  java
  • codeforces_C. Maximum Subrectangle

    http://codeforces.com/contest/1060/problem/C

    题意:

    a、b数组长度分别为n、m。矩阵C,Cij=ai*bj。在C中找到一个子矩阵,该子矩阵所有元素和不大于x,求这样的子矩阵的最大面积。

    思路:

    1、将矩阵元素和转换为(Ai+……+Aj)*(Bk+……+Bl)的形式,即a数组中一段连续的元素和 乘以 b数组中一段连续的元素和。

    2、由于只要求求出最大面积,故长和宽的起点终点位置任意,故只需统计a、b数组所有连续长度的最小元素和(例,a的长度为5的连续段的元素和的最小值)

    最后依次枚举子矩阵的长和宽。

    #include<cstdio>
    #include<iostream>
    using namespace std;
    #define LL long long
    int main()
    {
        LL x;
        int n,m,num1[2005],num2[2005];
        int sub1[2005],sub2[2005],sum1[2005],sum2[2005];
        sum1[0]=sum2[0]=0;
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            for(int i=1; i<=n; i++)
            {
                scanf("%d",&num1[i]);
                sum1[i]=sum1[i-1]+num1[i];
                sub1[i]=2000*2000;
            }
    
            for(int i=1; i<=m; i++)
            {
                scanf("%d",&num2[i]);
                sum2[i]=sum2[i-1]+num2[i];
                sub2[i]=2000*2000;
            }
    
            scanf("%I64d",&x);
    
            for(int i=1; i<=n; i++)
                for(int j=i; j<=n; j++)
                {
                    int len=j-i+1;
                    sub1[len]=min(sub1[len],sum1[j]-sum1[i-1]);
                }
            for(int i=1; i<=m; i++)
                for(int j=i; j<=m; j++)
                {
                    int len=j-i+1;
                    sub2[len]=min(sub2[len],sum2[j]-sum2[i-1]);
                }
    
            int res=0;
            for(int i=1;i<=n;i++)
                for(int j=1;j<=m;j++)
                    if((LL)sub1[i]*sub2[j]<=x)  //两个sub相乘可能超int
                        res=max(res,i*j);
            printf("%d
    ",res);
        }
        return 0;
    }
  • 相关阅读:
    图片切换的练习
    固定定位
    绝对定位
    相对定位
    全局作用域 变量声明
    3种循环语句 JS基础
    解除绑定事件 和 封装兼容性addEvent 来处理针对于不同浏览器的兼容方法
    插入排序法 猴子选大王 检索的数组 验证身份证号码 练习
    [z]JSONP例子
    ireport related
  • 原文地址:https://www.cnblogs.com/jasonlixuetao/p/9746211.html
Copyright © 2011-2022 走看看