WQS二分

news2024/10/5 13:13:31

本博客以一种较为少见的方式来解释WQS二分。

题目

首先,WQS二分用于解决什么问题?

我们先看一个伞兵题目:

有一个 n n n 个数的数组 a a a
求在 a a a 中恰好选择 m m m 个数的情况下,选择的数的和的最大值。

你现在看到了这个题目,你发现你不会排序,不会贪心。

你打算用另一种方式解决这题。

做法

我们定义 g ( x ) g(x) g(x) 为恰好选择 x x x 个数的情况下,选择的数的和的最大值。

经过观察,我们发现 g ( x ) g(x) g(x) 是一个凸函数。

g(x)
这表明, g ( x ) g(x) g(x) 只有一个最大值(也就是把所有正数都取了的情况)。

但你取不到,因为他不一定是 m m m

如果我们不考虑 m m m 的限制,肯定会取这个最大值。

那么我们考虑如何做出改变使得不用考虑 m m m 的限制。

考虑给选择数一个惩罚或奖励 k k k,我们每次选择一个数,答案就增加 k k k。(谁告诉你 k k k 不能是负数了)

于是,这个函数 g ( x ) g(x) g(x) 就转变成另一个函数 f ( x ) = g ( x ) + k x f(x) = g(x) + kx f(x)=g(x)+kx 了。

显然,当 k k k 取值增大, f ( x ) f(x) f(x) 的最大值取值位置就往右移动。

k k k 取值减少, f ( x ) f(x) f(x) 最大值取值位置往左移动。

而我们能够轻易的对于每个 k k k 计算 f ( x ) f(x) f(x) 最大值取值位置和 f ( x ) f(x) f(x) 最大值( O ( n ) O(n) O(n))。

所以,我们可以二分 k k k,根据当前 k k k f ( x ) f(x) f(x) 最大值取值位置与题目限制 m m m 的大小关系来更改 k k k

最终可以获得最大值取值位置为 m m m 时的 k k k f ( m ) f(m) f(m)

然后通过 f ( x ) = g ( x ) + k x f(x) = g(x) + kx f(x)=g(x)+kx,可以反推出 g ( m ) = f ( m ) − k m g(m) = f(m) - km g(m)=f(m)km

做完了, O ( n log ⁡ n ) O(n\log n) O(nlogn)我们震惊的发现时间复杂度和原做法没区别。

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

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

相关文章

Jenkins基于Blue Ocean UI构建流水线

目录 一、Blue Ocean 简介 二、Blue Ocean 安装 2.1 安装 Blue Ocean 插件 2.2 安装 Blue Ocean 版本的 Jenkins 3. 构建流水线 4. 创建流水线 5. 选择代码仓库 6. 连接Git仓库 7. 创建流水线 详细信息可以参考官网:Blue Ocean 入门 一、Blue Ocean 简介…

牛客竞赛每日俩题 - Day13

目录 洪泛法BFS 26进制计数字符串 洪泛法BFS 红与黑__牛客网 循环接收每组用例,对于每组用例进行如下操作: 找到‘’所在的位置,即起始搜索的点 使用DFS搜索地板中的每块瓷砖,如果是黑色,给计数1,然后像…

JavaSE学习day2_01, 数据类型

1. 数据类型 1.1 Java中数据类型的分类,重点 基本数据类型 引用数据类型 1.2 基本数据类型的四类八种 整数类型:byte、short、int、long 浮点类型:float、double 字符类型:char 布尔类型:boolean,只有两个取值,true和false…

HW13 Network Compression网络压缩

文章目录一、任务描述1、介绍知识蒸馏2、介绍架构设计二、实验1、simple baselineconfigs结构设计训练2、medium baselineconfigs3、strong baselineconfigsReLu和leakyRelu知识蒸馏一、任务描述 ●网络压缩:使您的模型更小而不损失性能。 ●在这个任务中&#xff…

初级算法之深度搜索

目录 ​编辑 概述: 个人对深搜的理解: 深搜模板: 例题: 题目描述 输入格式 输出格式 输入输出样例 说明/提示 代码图示: 概述: 在我们刷算法的过程中肯定会想到暴力通过,暴力是不需要…

分类预测 | MATLAB实现超参数优化朴素贝叶斯(Naive Bayesian)多特征分类预测

分类预测 | MATLAB实现超参数优化朴素贝叶斯(Naive Bayesian)多特征分类预测 目录 分类预测 | MATLAB实现超参数优化朴素贝叶斯(Naive Bayesian)多特征分类预测分类效果基本介绍程序设计学习小结参考资料分类效果 基本介绍 MATLAB实现超参数优化朴素贝叶斯(Naive Bayesian)多特…

行为型-策略模式

策略模式简介 策略模式(Strategy Pattern)属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。其主要目…

【Kotlin】空安全 ⑤ ( 异常处理 | 捕获并处理异常 | 抛出自定义异常 )

文章目录一、Kotlin 中的异常处理1、捕获并处理异常2、抛出自定义异常一、Kotlin 中的异常处理 在 Kotlin 程序中 , 处理异常 的方式有 : 抛出默认异常抛出自定义异常捕获并处理异常 1、捕获并处理异常 捕获异常代码示例 : 在下面的代码中 , name 变量是可空类型变量 , 其初始…

C语言入门(三)——简单函数

数学函数在数学中我们用过sin和ln这样的函数&#xff0c;例如Vin(ʌ &#xff0c;ln10等等&#xff0c;在C语言中也可以使用这些函数&#xff08;ln函数在C标准库中叫做log&#xff09;&#xff1a;在C语言中使用数字函数#include <math.h> #include <stdio.h> int…

生物化学 SY003地西泮(三大经典药物的老三)

历史 1864年 巴比妥酸 2,4,6-三羟基嘧啶, 丙二酰脲 “芭芭拉的尿酸” 巴比妥酸是一种有机化合物&#xff0c;化学式为C4H4N2O3&#xff0c;它由德国化学家阿道夫冯拜尔在研究尿酸时发现。巴比妥酸的德语名称“Barbitursure”衍生自拜尔的爱人芭芭拉&#xff08;Babara&#xf…

本周大新闻|CES 2023 AR/VR最全汇总

本周正值CES 2023举办期间&#xff0c;大新闻正好结合大会上的AR/VR新闻进行汇总。AR方面&#xff0c;The Information爆料更多苹果AR/VR头显信息&#xff1b;郭明錤表示苹果MR或再次推迟至Q3或年底&#xff1b;Mojo Vision裁员75%&#xff0c;专注Micro LED技术&#xff1b;消…

数据结构之二叉树的相关概念

今天我们来了解一下二叉树是什么。 二叉树介绍 要想明白二叉树&#xff0c;还得先了解一下树的定义。 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff…

图机器学习时间简史

自监督学习是大的算法研究方向。 图结构图特征是图神经网络的两个创新方面&#xff1b; 2022图神经网络的突破&#xff1a; 1.一些范式的突破&#xff1a;常常借鉴CV和NLP 2.很多新的自然界的应用场景上应用创新&#xff1a;天气预报&#xff0c;蛋白质&#xff0c;小分子&am…

linux(07)之内核系统调用

Linux(07)之内核系统调用 Author&#xff1a;Once Day Date&#xff1a;2023年1月7日 漫漫长路&#xff0c;才刚刚开始… 文章目录Linux(07)之内核系统调用1.概述2. 系统调用2.1 无参数的系统调用定义2.2 带参数的系统调用定义2.2.1 __diag诊断宏2.2.2 __MAP参数映射处理宏2.…

go的安装、gin安装以及GoLand的配置

一.go的安装以及Goland配置go的安装&#xff1a;https://www.runoob.com/go/go-environment.htmlMAC 系统下你可以使用 .pkg 结尾的安装包直接双击来完成安装&#xff0c;安装目录在 /usr/local/go/ 下。mac中按 ⌘shift. 即可显示隐藏文件夹&#xff0c;再按一次&#xff0c;即…

Spring4 全细节回顾

spring细节回顾 1、IOC/DI ApplicationContext接口是BeanFactory接口的子接口&#xff0c;Spring所有的东西都扔到了这里边。 1、Beans&#xff1a;Spring负责创建类对象并管理对象&#xff1b; 2、Core&#xff1a;核心类&#xff1b; 3、Context&#xff1a;上下文参数&a…

机器学习(4)——周志华

归纳偏好 若非必要&#xff0c;勿增实体 若多个算法都能解决同一个问题&#xff0c;则选取最简单的算法 当前什么样的偏好与问题更匹配&#xff0c;必须对问题有一个清楚的认识

shader基础入门(2)(VertexHelper)

VertexHelper&#xff08;顶点帮助器/顶点辅助类/顶点助手&#xff09; 官方资料版本&#xff1a;2019.1 使用需要继承&#xff1a;using UnityEngine.UI; 描述 可以帮助为 UI 生成网格的实用程序类。 此类实现 IDisposable 以帮助进行内存管理。 属性 currentIndexCount …

【vim工具的使用】

目录&#xff1a;前言一、普通/命令模式1.文件中移动 - 12.文件中移动 - 23.复制、粘贴、剪切、删除4.行内删除5.撤回6.替换7.高亮选中8.逐单词移动 - 3二、底行模式1.退出vim2.设置行号3.替换4.搜索3.不退出vim的情况下进行操作4.多文件操作三、替换模式四、插入模式总结前言 …

Python递归小练习

递归算法是常见的基础算法之一&#xff0c;阶乘、青蛙跳台、兔子算法等便是递归算法中典型的例子。 1、阶乘以6的阶乘为例&#xff0c;计算的过程如下图所示 Python代码实现如下&#xff1a; def jiecheng(n):if n 1:result 1else:result n * jiecheng(n - 1)return resul…