IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 牛客2021暑期训练4-J-Average -> 正文阅读

[数据结构与算法]牛客2021暑期训练4-J-Average

牛客2021暑期训练4-J-Average

题目链接

题意

给定 n*m 的矩阵,w[i][j]=a[i]+b[j],求一个不小于 x * y 的子矩阵,其平均值最大
n,m,ai,bi≤105

题解

在这里插入图片描述

假设我们要求的子矩阵为
t o t = ∑ i = x 1 x 2 ∑ j = y 1 y 2 ( a i + b j ) = ( y 2 ? y 1 + 1 ) ? ∑ i = x 1 x 2 a i + ( x 2 ? x 1 + 1 ) ? ∑ j = y 1 y 2 b j tot=\sum_{i=x1}^{x2}\sum_{j=y1}^{y2}(a_i+b_j)=(y2-y1+1)*\sum_{i=x1}^{x2}a_i+(x2-x1+1)*\sum_{j=y1}^{y2}b_j tot=i=x1x2?j=y1y2?(ai?+bj?)=(y2?y1+1)?i=x1x2?ai?+(x2?x1+1)?j=y1y2?bj?
那么
a v e = ( y 2 ? y 1 + 1 ) ? ∑ i = x 1 x 2 a i + ( x 2 ? x 1 + 1 ) ? ∑ j = y 1 y 2 b j ( x 2 ? x 1 + 1 ) ? ( y 2 ? y 1 + 1 ) = ∑ i = x 1 x 2 a i x 2 ? x 1 + 1 + ∑ i = y 1 y 2 b j y 2 ? y 1 + 1 ave=\frac{(y2-y1+1)*\sum_{i=x1}^{x2}a_i+(x2-x1+1)*\sum_{j=y1}^{y2}b_j}{(x2-x1+1)*(y2-y1+1)}=\frac{\sum_{i=x1}^{x2}a_i}{x2-x1+1}+\frac{\sum_{i=y1}^{y2}b_j}{y2-y1+1} ave=(x2?x1+1)?(y2?y1+1)(y2?y1+1)?i=x1x2?ai?+(x2?x1+1)?j=y1y2?bj??=x2?x1+1i=x1x2?ai??+y2?y1+1i=y1y2?bj??
也就是说,我们只需对 a 数组求连续且长度不小于 x 的最大平均值,b数组同理,接下来关键怎么求最大值
显然可以考虑单调性。假设 q 中为单减的平均值,遍历一个 i 可以弹出 q 末尾小于以 i 为结尾长度为 x 的平均值,以维护单调性,可以证明 q 前面的平均值加上一段相同的值仍是单减的

DB Ave(int l,int r)
{
	return (sum[r]-sum[l-1])/(DB)(r-l+1);
}
for(int i=x;i<=n;i++)
{
	while(0<=t&&Ave(q[t],i)<Ave(i-x+1,i)) t--;
	q[++t]=i-x+1;
	ans1=max(ans1,Ave(q[0],i));
}

代码

#include<bits/stdc++.h>
#define LL long long
#define DB double
using namespace std;
const int N=1e5+9;
int n,m,x,y,t;
DB ans1,ans2;;
int q[N];
DB a[N],sum[N];
DB Ave(int l,int r)
{
	return (sum[r]-sum[l-1])/(DB)(r-l+1);
}
int main()
{
	cin>>n>>m>>x>>y;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		sum[i]=sum[i-1]+a[i];
	}
	t=-1;
	for(int i=x;i<=n;i++)
	{
		while(0<=t&&Ave(q[t],i)<Ave(i-x+1,i)) t--;
		q[++t]=i-x+1;
		ans1=max(ans1,Ave(q[0],i));
	}
	memset(sum,0,sizeof(sum));
	for(int i=1;i<=m;i++)
	{
		cin>>a[i];
		sum[i]=sum[i-1]+a[i];
	}
	t=-1;
	memset(q,0,sizeof(q));
	for(int i=y;i<=m;i++)
	{
		while(0<=t&&Ave(q[t],i)<Ave(i-y+1,i)) t--;
		q[++t]=i-y+1;
		ans2=max(ans2,Ave(q[0],i));
	}
	printf("%.10lf",ans1+ans2);
	return 0;
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-07-28 00:18:38  更:2021-07-28 00:19:44 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 17:41:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码