前缀和|二分查找|LeetCode2234| 花园的最大总美丽值

作者推荐

贪心算法LeetCode2071:你可以安排的最多任务数目

本文涉及的基础知识点

C++算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频

二分查找算法合集

题目

Alice 是 n 个花园的园丁,她想通过种花,最大化她所有花园的总美丽值。
给你一个下标从 0 开始大小为 n 的整数数组 flowers ,其中 flowers[i] 是第 i 个花园里已经种的花的数目。已经种了的花 不能 移走。同时给你 newFlowers ,表示 Alice 额外可以种花的 最大数目 。同时给你的还有整数 target ,full 和 partial 。
如果一个花园有 至少 target 朵花,那么这个花园称为 完善的 ,花园的 总美丽值 为以下分数之 和 :
完善 花园数目乘以 full.
剩余 不完善 花园里,花的 最少数目 乘以 partial 。如果没有不完善花园,那么这一部分的值为 0 。
请你返回 Alice 种最多 newFlowers 朵花以后,能得到的 最大 总美丽值。
示例 1:
输入:flowers = [1,3,1,1], newFlowers = 7, target = 6, full = 12, partial = 1
输出:14
解释:Alice 可以按以下方案种花

  • 在第 0 个花园种 2 朵花
  • 在第 1 个花园种 3 朵花
  • 在第 2 个花园种 1 朵花
  • 在第 3 个花园种 1 朵花
    花园里花的数目为 [3,6,2,2] 。总共种了 2 + 3 + 1 + 1 = 7 朵花。
    只有 1 个花园是完善的。
    不完善花园里花的最少数目是 2 。
    所以总美丽值为 1 * 12 + 2 * 1 = 12 + 2 = 14 。
    没有其他方案可以让花园总美丽值超过 14 。
    示例 2:
    输入:flowers = [2,4,5,3], newFlowers = 10, target = 5, full = 2, partial = 6
    输出:30
    解释:Alice 可以按以下方案种花
  • 在第 0 个花园种 3 朵花
  • 在第 1 个花园种 0 朵花
  • 在第 2 个花园种 0 朵花
  • 在第 3 个花园种 2 朵花
    花园里花的数目为 [5,4,5,5] 。总共种了 3 + 0 + 0 + 2 = 5 朵花。
    有 3 个花园是完善的。
    不完善花园里花的最少数目为 4 。
    所以总美丽值为 3 * 2 + 4 * 6 = 6 + 24 = 30 。
    没有其他方案可以让花园总美丽值超过 30 。
    注意,Alice可以让所有花园都变成完善的,但这样她的总美丽值反而更小。
    提示:
    1 <= flowers.length <= 105
    1 <= flowers[i], target <= 105
    1 <= newFlowers <= 1010
    1 <= full, partial <= 105

分析

时间复杂度

O(targetlogn),n是花园数量。枚举不完善花园的花的最少数目,时间复杂度O(target);二分查找,能让多少花园完善,时间复杂度O(n)。

分情况讨论

如果能让所有花园完善没有非完善花园
有非完善花园枚举非完善花园最少的花数目

注意:

iMin 有效的条件:
一,至少一个花园的数目小于等于iMIn。
二,将花园数目少于iMin的全部补到iMin。
在确保有1个非完善花园的情况下,尽可能多的补完善花园。

完善花园的数目

由于前i个花园已经补了花,所以vNeed只对这i个花园以外的花园有效。
由于前面i个花园已经补充到iMin个,所以前i个花园只需要target-iMin个。
必须保留至少一个非完善花园

变量解析

vNeedvNeed[i]表示i+1个完美花园需要多少树,由于升序排序,所以从后
面向前补  |
llSum|记录 flowers[0,i)之和
iFullNum|完善花园数
# 代码
## 核心代码
class Solution {
public:long long maximumBeauty(vector<int>& flowers, long long newFlowers, int target, int full, int partial) {m_c = flowers.size();sort(flowers.begin(), flowers.end());vector<long long> vNeed;//vNeed[i]表示i+1个完美花园需要多少树for (int i = m_c - 1; i >= 0; i--){const int iCurNeed = max(0, target - flowers[i]);vNeed.emplace_back((vNeed.size()?vNeed.back():0) + iCurNeed);}long long llRet = (vNeed.back()<= newFlowers)?(long long)full*m_c:0;long long llSum = 0;for (int iMin = 0,i = 0 ; iMin < target; iMin++){while ((i < m_c) && (flowers[i] <= iMin)){llSum += flowers[i++];//llSum记录 flowers[0,i)之0,i是长度}if (0 == i){continue;}const long long llMinNeed = (long long)iMin * i - llSum;if (llMinNeed > newFlowers){break;//无法确保最小值为iMin。}long long iFullNum = std::upper_bound(vNeed.begin(), vNeed.end(), newFlowers - llMinNeed)- vNeed.begin();//确保所有花园大于等于iMin的情况下,能有多少完美花园iFullNum = min(iFullNum, (long long)m_c - i);iFullNum += (newFlowers - llMinNeed - ((0 == iFullNum) ? 0: vNeed[iFullNum - 1]))/(target-iMin);//余下的花能将flowers[0,i)中的多少花园弄成完美花园iFullNum = min(iFullNum, (long long)m_c - 1);llRet = max(llRet, (long long)partial * iMin + (long long)full * iFullNum);}return llRet;}int m_c;
};

测试用例

template
void Assert(const vector& v1, const vector& v2)
{
if (v1.size() != v2.size())
{
assert(false);
return;
}
for (int i = 0; i < v1.size(); i++)
{
assert(v1[i] == v2[i]);
}
}

template
void Assert(const T& t1, const T& t2)
{
assert(t1 == t2);
}

int main()
{
vector flowers;
long long newFlowers;
int target, full, partial;
long long res;
{
Solution slu;
flowers = { 1, 3, 1, 1 }, newFlowers = 7, target = 6, full = 12, partial = 1;
auto res = slu.maximumBeauty(flowers, newFlowers, target, full, partial);
Assert(14LL, res);
}
{
Solution slu;
flowers = { 2, 4, 5, 3 }, newFlowers = 10, target = 5, full = 2, partial = 6;
auto res = slu.maximumBeauty(flowers, newFlowers, target, full, partial);
Assert(30LL, res);
}
{
Solution slu;
flowers = { 18,16,10,10,5 }, newFlowers = 10, target = 3, full = 15, partial = 4;
auto res = slu.maximumBeauty(flowers, newFlowers, target, full, partial);
Assert(75LL, res);
}
{
Solution slu;
flowers = { 36131,31254,5607,11553,82824,59230,40967,69571,36874,38700,81107,28500,61796,54371,23405,51780,75265,37257,86314,32258,47254,76690,18014,21538,96700,15094,57253,57073,7284,24501,21412,69582,15724,43829,81444,78281,88953,6671,94646,31037,89465,86033,27431,30774,48592,26067 },
newFlowers = 2304903454, target = 48476, full = 5937, partial = 15214;
auto res = slu.maximumBeauty(flowers, newFlowers, target, full, partial);
Assert(737765815LL, res);
}
{
Solution slu;
flowers = { 3,3 };
newFlowers = 100000, target = 3, full = 3, partial = 3;
auto res = slu.maximumBeauty(flowers, newFlowers, target, full, partial);
Assert(6LL, res);
}

//CConsole::Out(res);

}

2023 年旧版

class Solution {
public:
long long maximumBeauty(vector& flowers, long long newFlowers, int target, int full, int partial) {
m_c = flowers.size();
std::sort(flowers.begin(), flowers.end());
vector vFullNeed;
for (int i = m_c - 1; i >= 0; i–)
{
const int iNeed = target - flowers[i];
if (iNeed > 0 )
{
const long long iPre = vFullNeed.size() ? vFullNeed.back() : 0;
vFullNeed.emplace_back(iNeed + iPre);
}
else
{
vFullNeed.emplace_back(0);
}
}
vector vSum(1);
for (const auto& i : flowers)
{
vSum.push_back(vSum.back() + i);
}
long long llRet = 0;
for (int iMin = flowers.front(); iMin <= target; iMin++)
{
int iLessEqualNum = std::upper_bound(flowers.begin(), flowers.end(), iMin) - flowers.begin();
long long llNeed = (long long)iMin * iLessEqualNum - vSum[iLessEqualNum];
if (llNeed > newFlowers)
{
break;
}
if (target == iMin)
{
llRet = max(llRet, (long long)full* m_c);
break;
}
int iFullNum = std::upper_bound(vFullNeed.begin(), vFullNeed.end(),newFlowers - llNeed ) - vFullNeed.begin();
iFullNum = min(iFullNum, m_c - iLessEqualNum);
long long llUpFlowers = newFlowers - llNeed - ((0 == iFullNum) ? 0 : vFullNeed[iFullNum - 1]);
const int iUpNum = min((long long)iLessEqualNum - 1, llUpFlowers / (target - iMin));
iFullNum += iUpNum;
llRet = max(llRet, (long long)fulliFullNum + (long long)partial * iMin);
}
if (flowers.front() > target)
{
return (long long)full
m_c;
}
return llRet;
}
int m_c;
};

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快

速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关下载

想高屋建瓴的学习算法,请下载《喜缺全书算法册》doc版
https://download.csdn.net/download/he_zhidan/88348653

我想对大家说的话
闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业

。也就是我们常说的专业的人做专业的事。 |
|如果程序是一条龙,那算法就是他的是睛|

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境:

VS2022 C++17

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

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

相关文章

pycharm中debug,py文件

1、先把需要的实参传入 2、在合适位置打上断点 3、在小三角旁边右键调用调试 4.步进/步出查看 5.选择单步执行&#xff0c;走的更慢

使用Python实现爬虫IP负载均衡和高可用集群

做大型爬虫项目经常遇到请求频率过高的问题&#xff0c;这里需要说的是使用爬虫IP可以提高抓取效率&#xff0c;那么我们通过什么方法才能实现爬虫IP负载均衡和高可用集群&#xff0c;并且能快速的部署并且完成爬虫项目。 通常在Python中实现爬虫ip负载均衡和高可用集群需要一…

基于ssm助学贷款网站论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本助学贷款管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息…

CTF 7

信息收集 存活主机探测 arp-scan -l 端口探测 nmap -sT --min-rate 10000 -p- 192.168.0.5 服务版本等信息 nmap -sT -sV -sC -O -p22,80,137,138,139,901,5900,8080,10000 192.168.0.5Starting Nmap 7.94 ( https://nmap.org ) at 2023-11-02 21:23 CST Stats: 0:01:30 elaps…

​劲松中西医结合医院专家讲解hpv36阳性是否严重

​劲松中西医结合医院专家讲解hpv36阳性严重性问题 HPV36阳性&#xff0c;就像一场潜在的暴风雨&#xff0c;预示着可能的危机。它代表了一种高危型的HPV感染&#xff0c;就像一只隐藏在暗处的猛兽&#xff0c;随时可能暴起伤人。然而&#xff0c;就像生活中的许多挑战&#x…

Python 在控制台打印带颜色的信息

#格式&#xff1a;  设置颜色开始 &#xff1a;\033[显示方式;前景色;背景色m #说明&#xff1a; 前景色 背景色 颜色 --------------------------------------- 30 40 黑色 31 41 红色 32 …

Linux环境下ARM开发

目录 前言ARM启动及开发基础1.Cortex-A架构2.启动方式3.汇编基础4.Makefile语法基础5.Makefile补充6.编译下载 结语 前言 主要介绍基于linux开发环境下&#xff0c;如何开发ARM A7 ARM启动及开发基础 1.Cortex-A架构 1&#xff09;Cortex-A7运行模式 模式说明User(USR)用户模…

RK3588 平台的libevent库的交叉编译

1、下载libevent库&#xff0c;官网https://libevent.org/ 2、解压 3、配置 ./configure --prefix/home/harmony/Lib_self/cross --hostarm-linux-gnueabihf CCaarch64-linux-gnu-gcc --prefix指定安装目录, --host指定将要运行的特定平台 CC指定C语言的编译器 CXX指定C语言…

智能化转型比想象中更难,九牧智能马桶深陷口碑危机

智能化浪潮正深刻改变着消费者日常生活的方方面面&#xff0c;也推动着传统卫浴品牌面向智能化转型的步伐。 而在一众耳熟能详的中国卫浴品牌中&#xff0c;九牧可以称得上是面向数字化、智能化、高端化转型的先锋。 就在近日&#xff0c;九牧刚刚举行了一场盛大的第1000万套…

销售技巧培训之如何提升销售沟通技巧

销售技巧培训之如何提升销售沟通技巧 现在市场环境竞争越来越激烈&#xff0c;产品越来越过剩&#xff0c;如何把产品卖出去是摆在企业面前的难题。所以打造一致所向披靡的销售团队&#xff0c;提升销售人员的系统化销售能力就显得非常重要。在销售系统培训模块中&#xff0c;…

Python第三次练习

Python 一、如何判断一个字符串是否是另一个字符串的子串二、如何验证一个字符串中的每一个字符均在另一个字符串中出现三、如何判定一个字符串中既有数字又有字母四、做一个注册登录系统 一、如何判断一个字符串是否是另一个字符串的子串 实现代码&#xff1a; string1 inp…

安装node.js并创建第一个vue项目

目录 一&#xff0c;下载node.js 二&#xff0c;创建一个vue项目 一&#xff0c;下载node.js 1.进入官网&#xff1a;Node.js (nodejs.org) 2.选择版本 3.选择安装方式 4.运行安装包&#xff0c;下载文件 5.选择要安装的路径后一直next 6.安装完成后打开命令提示符&#xff…

python获取js data.now同款时间戳

import requestsimport time from datetime import datetimecu_t datetime.now() se cu_t.timestamp()*1000 se int(se) print(se)#cur_time time.time()*1000 #seconds int(cur_time) #print(seconds)

C++——红黑树

作者&#xff1a;几冬雪来 时间&#xff1a;2023年12月7日 内容&#xff1a;C——红黑树讲解 目录 前言&#xff1a; 红黑树的概念&#xff1a; 红黑树的性质&#xff1a; 红黑树的路径计算&#xff1a; 最长路径和最短路径&#xff1a; AVL树与红黑树的区别&#xff…

【Docker】Swarm的overlay网络

对于理解swarm的网络来讲&#xff0c;个人认为最重要的两个点&#xff1a; 第一是外部如何访问部署运行在swarm集群内的服务&#xff0c;可以称之为入方向流量&#xff0c;在swarm里我们通过ingress来解决。 第二是部署在swarm集群里的服务&#xff0c;如何对外进行访问&…

力扣题:字符的统计-12.6

力扣题-12.6 [力扣刷题攻略] Re&#xff1a;从零开始的力扣刷题生活 力扣题1&#xff1a;696. 计数二进制子串 解题思想&#xff1a;先统计连续的0和连续的1的个数&#xff0c;然后进行相加即可&#xff08;想不到一点&#xff09; class Solution(object):def countBinaryS…

EI级 | Matlab实现TCN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测

EI级 | Matlab实现TCN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测 目录 EI级 | Matlab实现TCN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.【EI级】Matlab实现TCN-LSTM-Multihead-Attent…

egen3 rowwise().maxCoeff()的使用

1、安装eigen3 2、引用头文件 3、代码测试 MatrixXf aaa(2, 4);aaa << 1, 2, 3, 4, 5, 6, 7, 8; Vector2f diff(10, 20);aaa.colwise() diff;std::cout << "new_aaa : " << aaa << endl; 全部代码&#xff1a; int main() {MatrixXf …

Ubuntu18安装(重启黑屏问题)

1. F10 进入bios&#xff0c;选择u盘里的ubuntu镜像 2.进入使用ubuntu&#xff0c;下载 3.重启&#xff0c;esc 4.ubuntu 安e进入 5. nomodeset&#xff08;&#xff09; F10 保存启动 6. 7.没有网 手机usb提供网络 下载有限网卡驱动

【头歌实训】分布式文件系统 HDFS

文章目录 第1关&#xff1a;HDFS的基本操作任务描述相关知识HDFS的设计分布式文件系统NameNode与DataNode HDFS的常用命令 编程要求测试说明答案代码 第2关&#xff1a;HDFS-JAVA接口之读取文件任务描述相关知识FileSystem对象FSDataInputStream对象 编程要求测试说明答案代码 …