二分+前缀和——森林的最大美丽值

森林的最大美丽值(二分+差分数组)

题目分析

求最小值的最大值,联想到二分。

第一阶段二段性分析

对于所有树的高度都可以大于等于mid,那么我们可以确定高度小于mid的值一定也可以,但是此时我需要找的是最大的高度,那么mid一定比小于mid的值更大,所以小于mid的值我就不用管了,也就是我可以确定我能够舍弃掉mid左边的值。我还想要确定比mid更大的边长是否也满足条件,所以我要在mid的右边继续二分。

if (check(mid)) {l = mid;} //因为mid是符合条件的,所以我要留着它,而不是l=mid+1

对于所有树的高度不能满足都大于等于mid,那么我们可以确定高度大于mid的值一定也不满足,所以大于等于mid的值我就不用管了,也就是我可以确定我能够舍弃掉mid右边的值。我还想要寻找比mid更小的高度是否能满足条件,所以我要在mid的左边继续二分。

else { r = mid - 1; }//因为mid是不符合条件的,所以我不要留着它,而不是r=mid
//主要这里出现了减法,那么求mid那么应该是(l+r+1)/2

综上该题满足二段性,可以用二分,二分的板子就不说了,接下来说一下check函数如何写。

第二阶段写check函数

check(u)要实现的作用是检查能否在m天内让所有树的高度都大于等于u。

依次遍历每一棵树,如果当前树的高度a[i]小于mid,那么需要给他增高,增高耗费的天数是(mid-a[i])。但是我们要注意一旦选择增高不是只给一颗树增高,而是给一个区间里的树进行增高,那么这就涉及到区间修改,我们可以使用差分数组。现在重新考虑遍历每一棵树,当前树的实际高度是a[i]+sum[i],这里的sum[i]是差分数组的前缀和,如果a[i]+sum[i]<x,那么我们要给这棵树增高,耗费的天数和增加的高度是x-a[i]-sum[i],对于差分数组的变化是d[i]+=x-a[i]-sum[i],d[i+k]-=x-a[i]-sum[i],注意这里的i+k可能会有下标越界问题,所以要改成d[min(i+k,n+1)]-=x-a[i]-sum[i],如果耗费的总天数超过了m,即cnt<0,就返回false,否则返回true。注意这里更改了d[i]后,对应的sum[i]也要随之更新,否则这里d[i]的改变没有传递下去。

public static boolean check(int x) {int d[] = new int[100010];int sum[] = new int[100010];int cnt = m;for(int i=1;i<=n;i++) {sum[i] =sum[i-1]+d[i];if(a[i]+sum[i]<x) {cnt-=x-a[i]-sum[i];d[i]+=x-a[i]-sum[i];d[Math.min(i+k,n+1)]+=sum[i]+a[i]-x;sum[i]+=x-a[i]-sum[i];if(cnt<0) return false;}}return true;
}

第三步二分范围确定

那么这里的高度的最小值是1,最大值就是树的最大高度,也就是1e9+1。

题目代码

import java.util.Scanner;
public class Main {static int n,m,k;static int a[] = new int[100010];public static boolean check(int x) {int d[] = new int[100010];int sum[] = new int[100010];int cnt = m;for(int i=1;i<=n;i++) {sum[i] =sum[i-1]+d[i];if(a[i]+sum[i]<x) {cnt-=x-a[i]-sum[i];d[i]+=x-a[i]-sum[i];d[Math.min(i+k,n+1)]-=x-a[i]-sum[i];sum[i]+=x-a[i]-sum[i];if(cnt<0) return false;}}return true;}public static void main(String[] args) {Scanner scan = new Scanner(System.in);n=scan.nextInt();m=scan.nextInt();k=scan.nextInt();for(int i=1;i<=n;i++) a[i]=scan.nextInt();int l=1,r=1000000001;while(l<r) {int mid=(l+r+1)/2;if(check(mid)) l=mid;else r=mid-1;}System.out.print(l);}
}
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int N = 100010;
int n, m, k;
int a[N];
int d[N], sum[N];bool check(int x) {for (int i = 1; i <= n; ++i) d[i]=0,sum[i]=0;int cnt = m;for (int i = 1; i <= n; ++i) {sum[i] = sum[i - 1] + d[i];if (a[i] + sum[i] < x) {cnt -= x - a[i] - sum[i];d[i] += x - a[i] - sum[i];if (i + k <= n) d[i + k] -= x - a[i] - sum[i];sum[i] += x - a[i] - sum[i];if (cnt < 0) return false;}}return true;
}int main() {cin >> n >> m >> k;for (int i = 1; i <= n; ++i) cin >> a[i];int l = 1, r = 1000000001;while (l < r) {int mid = (l + r + 1) / 2;if (check(mid)) l = mid;else r = mid - 1;}cout << l << endl;return 0;
}
def check(x):d = [0] * (n + 1)sum = [0] * (n + 1)cnt = mfor i in range(1, n + 1):sum[i] = sum[i - 1] + d[i]if a[i] + sum[i] < x:cnt -= x - a[i] - sum[i]d[i] += x - a[i] - sum[i]if i + k <= n:d[i + k] -= x - a[i] - sum[i]sum[i] += x - a[i] - sum[i]if cnt < 0:return Falsereturn Truen, m, k = map(int, input().split())
a = [0] + list(map(int, input().split()))  # Using 1-based indexingl, r = 1, 1000000001#+1e5
while l < r:mid = (l + r + 1) // 2if check(mid):l = midelse:r = mid - 1print(l)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/72373.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pytorch实现之最小二乘梯度归一化设计

简介 简介:LSGAN提出了一种利用最小二乘法来计算两个数据分布之间的距离,该论文在此基础上采用梯度归一化来进一步稳定训练。 论文题目:LSN-GAN: A Novel Least Square Gradient Normalization for Generative Adversarial Networks(LSN-GAN:一种新的生成对抗网络的最小…

JavaScript基础-全局作用域

在JavaScript编程中&#xff0c;理解变量的作用域是编写高效、可维护代码的关键之一。全局作用域是指变量在整个程序范围内都可访问的状态&#xff0c;这意味着它们可以在任何函数或代码块中被读取和修改。然而&#xff0c;过度使用全局变量也可能导致一些问题&#xff0c;如命…

【2025.3.13】记一次双系统笔记本加装固态硬盘记录 linux扩容 linux更换/home和/opt所在硬盘 windows无法调整亮度

文章目录 &#x1f315;事情经过&#x1f315;更换/home和/opt的挂载硬盘&#x1f319;目的&#x1f319;初始化1t固态硬盘&#x1f319;打开Linux查看硬盘信息&#x1f319;给新1t固态硬盘分区&#x1f319;格式化分区&#x1f319;把新1t固态硬盘先挂载到/mnt/ssd_1t 用于后续…

山东省新一代信息技术创新应用大赛-计算机网络管理赛项(样题)

目录 竞赛试题 网络拓扑 配置需求 虚拟局域网 IPv4地址部署 OSPF及路由部署 配置合适的静态路由组网 MSTP及VRRP链路聚合部署 IPSEC部署 路由选路部署 设备与网络管理部署 1.R1 2.R2 3.S1 4.S2 5.S3 竞赛试题 本竞赛使用HCL(华三云实验室)来进行网络设备选择…

【测试语言基础篇】Python基础之List列表

一、Python 列表(List) 序列是Python中最基本的数据结构。序列中的每个元素都分配一个数字 - 它的位置&#xff0c;或索引&#xff0c;第一个索引是0&#xff0c;第二个索引是1&#xff0c;依此类推。 Python有6个序列的内置类型&#xff0c;但最常见的是列表和元组。序列都可…

大数据面试之路 (二) hive小文件合并优化方法

大量小文件容易在文件存储端造成瓶颈&#xff0c;影响处理效率。对此&#xff0c;您可以通过合并Map和Reduce的结果文件来处理。 一、合并小文件的常见场景 写入时产生小文件&#xff1a;Reduce任务过多或数据量过小&#xff0c;导致每个任务输出一个小文件。 动态分区插入&…

MySQL 批量插入 vs 逐条插

MySQL 插入数据&#xff1a;批量插入 vs 逐条插入&#xff0c;哪个更快&#xff1f; 在 MySQL 中&#xff0c;插入数据有两种常见方式&#xff1a; 批量插入&#xff1a;一条 SQL 插入多条数据。逐条插入&#xff1a;每次插入一条数据。 这两种方式有什么区别&#xff1f;哪…

Docker基础命令说明

Docker基础操作命令众多&#xff0c;这些命令可以按如下方式进行分类&#xff1a; 镜像操作容器操作网络操作数据卷操作LOG查询 等方面进行分类。 一、镜像操作命令 docker images&#xff1a;用于列出本地系统中所有的 Docker 镜像。镜像就像是一个模板&#xff0c;它包含…

AI重构私域增长:从流量收割到终身价值运营的三阶跃迁

私域运营的AI进化论&#xff1a;内容即服务的三个阶段 随着企业微信生态的成熟&#xff0c;私域运营正经历从"流量收割"到"关系养成"的本质转变。在AIGC技术的推动下&#xff0c;2024年私域场景正式进入**"内容即服务"**的价值共创期&#xff1…

Linux date 命令使用指南

date 命令用于 显示或设置系统日期和时间&#xff0c;支持灵活的时间格式化和计算。以下是常用场景与详细示例&#xff1a; 一、基本用法 1. 显示当前日期和时间 <BASH> date # 输出&#xff1a;Thu Jun 13 14:25:36 CST 20242. 设置系统时间&#xff08;需root权限&am…

Maven的依赖管理

maven相关依赖的官网&#xff1a;https://mvnrepository.com/ pom.xml是项目依赖的配置文件 maven首先会去本地仓库下载相关依赖&#xff0c;如果没有&#xff0c;则会去私服下载&#xff0c;再没有&#xff0c;就去中央仓库或镜像下载。 自定义properties&#xff0c;可使用…

Mybaties批量操作

1、批量插入 <!--批量操作-插入--><!-- 相当于INSERT INTO t_goods (c1,c2,c3) VALUES (a1,a2,a3),(b1,b2,b3),(d1,d2,d3),...--><insert id"batchInsert" parameterType"java.util.List">INSERT INTO t_goods (title,sub_title,origina…

向量库集成指南

文章目录 向量库集成指南Chroma集成Pinecone集成MiLvus集成向量库集成指南 向量库是一种索引和存储向量嵌入以实现高效管理和快速检索的数据库。与单独的向量索引不同,像Pinecone这样的向量数据库提供了额外的功能,例如,索引管理、数据管理、元数据存储和过滤,以及水平扩展…

软件测试之使用Requests库进行接口测试

文章目录 前言Requests库是什么为什么要用Requests库进行接口测试安装Requests库Requests库使用发送GET请求发送带查询参数的GET请求响应内容格式添加请求头信息发送一个POST请求查看响应内容断言请求超时Cookie与Session模拟登录 参考目录 前言 阅读本文前请注意最后编辑时间…

AttributeError: module ‘backend_interagg‘ has no attribute ‘FigureCanvas‘

AttributeError: module backend_interagg has no attribute FigureCanvas 这个错误通常是由于 Matplotlib 的后端配置问题引起的。具体来说&#xff0c;Matplotlib 在尝试加载某个后端时&#xff0c;发现该后端模块中缺少必要的属性&#xff08;如 FigureCanvas&#xff09;&a…

iWebOffice2015 中间件如何在Chrome107及之后的高版本中加载

iWebOffice2015是江西金格科技有限公司开发的一款智能文档中间件&#xff0c;和一些知名OA及ERP公司曾经达成OEM合作&#xff0c;所以用户一度比较多&#xff0c;但不幸的是Chromium内核浏览器在2022年10月份发布的107版本中永久取消了对PPAPI插件的加载支持&#xff0c;导致使…

【MyBatis Plus JSON 处理器简化数据库操作】

文章目录 什么是 MyBatis-Plus JSON 处理器&#xff1f;开始使用 MyBatis-Plus JSON 处理器步骤 1: 创建实体类步骤 2: 创建 Mapper 接口步骤 3: 查询 JSON 数据步骤 4: 插入和更新 JSON 数据 什么是 MyBatis-Plus JSON 处理器&#xff1f; MyBatis-Plus 是一个基于 MyBatis 的…

OpnenHarmony 开源鸿蒙北向开发——1.开发环境搭建(DevEco Studio 5.03)

我这边是基于window下对OpenHarmony开源鸿蒙进行北向开发。 一、安装DevEco Studio 1、下载 下载中心 | 华为开发者联盟-HarmonyOS开发者官网&#xff0c;共建鸿蒙生态 2、安装 下载完成之后进行解压 双击进行安装 按照我的步骤进行 选择安装目录&#xff0c;全部配置完成后…

深入 Python 网络爬虫开发:从入门到实战

一、为什么需要爬虫&#xff1f; 在数据驱动的时代&#xff0c;网络爬虫是获取公开数据的重要工具。它可以帮助我们&#xff1a; 监控电商价格变化抓取学术文献构建数据分析样本自动化信息收集 二、基础环境搭建 1. 核心库安装 pip install requests beautifulsoup4 lxml …

linux(ubuntu)中Conda、CUDA安装Xinference报错ERROR: Failed to build (llama-cpp-python)

文章目录 一、常规办法二、继续三、继续四、缺少 libgomp库&#xff08;最终解决&#xff09;在 Conda 环境中安装 libgomp 如果符合标题情况 执行的&#xff1a; pip install "xinference[all]"大概率是最终解决的情况。 一、常规办法 llama-cpp-python 依赖 CMak…