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[],num2[];
int sub1[],sub2[],sum1[],sum2[];
sum1[]=sum2[]=;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=; i<=n; i++)
{
scanf("%d",&num1[i]);
sum1[i]=sum1[i-]+num1[i];
sub1[i]=*;
} for(int i=; i<=m; i++)
{
scanf("%d",&num2[i]);
sum2[i]=sum2[i-]+num2[i];
sub2[i]=*;
} scanf("%I64d",&x); for(int i=; i<=n; i++)
for(int j=i; j<=n; j++)
{
int len=j-i+;
sub1[len]=min(sub1[len],sum1[j]-sum1[i-]);
}
for(int i=; i<=m; i++)
for(int j=i; j<=m; j++)
{
int len=j-i+;
sub2[len]=min(sub2[len],sum2[j]-sum2[i-]);
} int res=;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
if((LL)sub1[i]*sub2[j]<=x) //两个sub相乘可能超int
res=max(res,i*j);
printf("%d\n",res);
}
return ;
}

最新文章

  1. Android — Camera聚焦流程
  2. (转)对.net系统架构改造的一点经验和教训
  3. c# 小练习
  4. 关机相关(shutdown,reboot)
  5. java.lang.Exception: Socket bind failed 服务器端口冲突--&gt;修改端口
  6. 转:微博CacheService架构浅析
  7. 我的 Github 个人博客是怎样炼成的
  8. 全选js实现
  9. POJ 1696 Space Ant
  10. Objective-c runtime方法替换引发的死循环
  11. Ubuntu &amp; GitLab CI &amp; Docker &amp; ASP.NET Core 2.0 自动化发布和部署(2)
  12. 微信小程序实现简易留言板
  13. SQLServer之创建分布式事务
  14. oracle基本命令笔记
  15. Codeforces Round #370 (Div. 2) B. Memory and Trident 水题
  16. 如何使用.net访问Access数据库 (转)
  17. 非nodejs方式的vue.js的使用
  18. Python实现简单登陆验证(文件操作)
  19. 【转载】C++资源之不完全导引
  20. tsl/ssl 证书制作记录

热门文章

  1. [NOI2018] 归程 可持久化并查集
  2. myqsl02
  3. vim插件:显示树形目录插件NERDTree安装 和 使用【转】
  4. I.MX6 mkuserimg.sh 使用
  5. 第十七周 Leetcode 403. Frog Jump(HARD) 线性dp
  6. bzoj3696
  7. jQuery easyui datagrid pagenation 的分页数据格式
  8. String类的直接赋值和构造方法赋值的区别
  9. ubuntu mysql5.6二进制安装
  10. python 面向对象三 访问权限 下划线 双下划线