【位运算 反证法 试填法】2897.对数组执行操作使平方和最大

ops/2024/9/20 13:37:19/ 标签: 算法, 动态规划, c++, 力扣, 位运算, 反证法, 试填法

算法可以发掘本质,如:
一,若干师傅和徒弟互有好感,有好感的师徒可以结对学习。师傅和徒弟都只能参加一个对子。如何让对子最多。
二,有无限多1X2和2X1的骨牌,某个棋盘若干格子坏了,如何在没有坏的格子放足够多骨牌。
三,某个单色图,1表示前前景,0表示后景色。每次操作可以将一个1,变成0。如何在最少得操作情况下,使得没有两个1相邻(四连通)。
四,若干路人,有些人是熟人,如何选出最多的人参加实验。为了避免熟人影响实验的效果,参加的人不能是熟人。
一二是二分图的最大匹配,三是二分图的最小点覆盖,四是二分图最大独立集。 而这三者是等效问题。

本文涉及知识点

位运算 反证法 试填法

LeetCode2897对数组执行操作使平方和最大

给你一个下标从 0 开始的整数数组 nums 和一个 正 整数 k 。
你可以对数组执行以下操作 任意次 :
选择两个互不相同的下标 i 和 j ,同时 将 nums[i] 更新为 (nums[i] AND nums[j]) 且将 nums[j] 更新为 (nums[i] OR nums[j]) ,OR 表示按位 或 运算,AND 表示按位 与 运算。
你需要从最终的数组里选择 k 个元素,并计算它们的 平方 之和。
请你返回你可以得到的 最大 平方和。
由于答案可能会很大,将答案对 109 + 7 取余 后返回。
示例 1:
输入:nums = [2,6,5,8], k = 2
输出:261
解释:我们可以对数组执行以下操作:

  • 选择 i = 0 和 j = 3 ,同时将 nums[0] 变为 (2 AND 8) = 0 且 nums[3] 变为 (2 OR 8) = 10 ,结果数组为 nums = [0,6,5,10] 。
  • 选择 i = 2 和 j = 3 ,同时将 nums[2] 变为 (5 AND 10) = 0 且 nums[3] 变为 (5 OR 10) = 15 ,结果数组为 nums = [0,6,0,15] 。
    从最终数组里选择元素 15 和 6 ,平方和为 152 + 62 = 261 。
    261 是可以得到的最大结果。
    示例 2:

输入:nums = [4,5,4,7], k = 3
输出:90
解释:不需要执行任何操作。
选择元素 7 ,5 和 4 ,平方和为 72 + 52 + 42 = 90 。
90 是可以得到的最大结果。

提示:
1 <= k <= nums.length <= 105
1 <= nums[i] <= 109

位运算

性质一:假定某个最优解是res,res已经按升序排序。如果res.back()的某个二进制位为0,则整个res的此二进制位必定为0。反证法证明:
令 a < b,x = 1 << i ,a的第i个二进制位为1,b的第i个二进制位为0。
则两者之和为:y1= a2+b2
将a的对应1移到b后,两者之和为:
y2=(a-x)2+(b+x)2 = a2-2ax+x2+ b2+2bx+x2
y2-y1 = 2bx-2ax +2x2
2x2 > 0,且b >a ,则2bx-2ax> 0
故y2>y1。
同理删除res 最后的一个元素,余下元素也符合要求。
结论: res[i]的某个二进制位为0,则此二进制为res[j]也为0,j <i。

原理

题中的操作将nums[j]的二进值1移到nums[i]。
操作方式:
将所有nums[j]的1全部移到nums[0] j > 0
将所有nums[j]的1全部移到nums[1] j > 1
⋮ \vdots

思路

统计各二进制为1的个数。
从到大小构建res,如果cnt[j] > 0 则,第j位1,cnt[j]–;否则第j位为0。
初始化时间复杂度:O(nlog(max(n))
处理时间复杂度:O(klog(maxx(n)),处理时间可以优化到O(og(maxx(n)og(maxx(n)),因为除掉重复元素顶多log(max(n))个数,不同的数至少少一个二进制一。

代码

核心代码

template<int MOD = 1000000007>
class C1097Int
{
public:C1097Int(long long llData = 0) :m_iData(llData% MOD){}C1097Int  operator+(const C1097Int& o)const{return C1097Int(((long long)m_iData + o.m_iData) % MOD);}C1097Int& operator+=(const C1097Int& o){m_iData = ((long long)m_iData + o.m_iData) % MOD;return *this;}C1097Int& operator-=(const C1097Int& o){m_iData = (m_iData + MOD - o.m_iData) % MOD;return *this;}C1097Int  operator-(const C1097Int& o){return C1097Int((m_iData + MOD - o.m_iData) % MOD);}C1097Int  operator*(const C1097Int& o)const{return((long long)m_iData * o.m_iData) % MOD;}C1097Int& operator*=(const C1097Int& o){m_iData = ((long long)m_iData * o.m_iData) % MOD;return *this;}bool operator==(const C1097Int& o)const{return m_iData == o.m_iData;}bool operator<(const C1097Int& o)const{return m_iData < o.m_iData;}C1097Int pow(long long n)const{C1097Int iRet = 1, iCur = *this;while (n){if (n & 1){iRet *= iCur;}iCur *= iCur;n >>= 1;}return iRet;}C1097Int PowNegative1()const{return pow(MOD - 2);}int ToInt()const{return m_iData;}
private:int m_iData = 0;;
};class Solution {
public:int maxSum(vector<int>& nums, int k) {const int iBitCnt = 31;int cnt[iBitCnt] = { 0 };for (const auto& n : nums) {for (int j = 0; j < iBitCnt; j++) {if ((1 << j) & n) {cnt[j]++;}}}C1097Int<> biRet;while (k--) {int cur = 0;for (int j = 0; j < iBitCnt; j++) {if (cnt[j]) {cur |= (1 << j);cnt[j]--;}}biRet += (long long)cur * cur;}return biRet.ToInt();}
};

测试用例

template<class T>
void Assert(const T& t1, const T& t2)
{assert(t1 == t2);
}template<class T>
void Assert(const vector<T>& v1, const vector<T>& v2)
{if (v1.size() != v2.size()){assert(false);return;}for (int i = 0; i < v1.size(); i++){Assert(v1[i], v2[i]);}}int main()
{vector<int> nums;int k;{Solution sln;nums = { 2,6,5,8 }, k = 2;auto res = sln.maxSum(nums, k);Assert(261, res);}{Solution sln;nums = { 4,5,4,7 }, k = 3;auto res = sln.maxSum(nums, k);Assert(90, res);}
}

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步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
如无特殊说明,本算法用**C++**实现。


http://www.ppmy.cn/ops/3360.html

相关文章

循环开关定时器(Smart PLC梯形图代码)

很多设备不需要复杂的逻辑时序控制,只需要实现简单的循环定时开关功能,对于这样的控制我们可以利用定时器组合去实现,但是如果系统里需要循环定时控制的设备比较多,那我们建议大家编写一个这样的循环定时开关功能块,SMART PLC循环开关定时器还可以参考下面文章链接 1、周…

【C语言__动态内存管理__复习篇6】

目录 前言 一、动态内存管理 二、动态内存函数 2.1 malloc 2.2 free 2.3 calloc 2.4 realloc 三、动态内存常见的6个使用错误 3.1 接收malloc/calloc返回的参数后未及时检查是否为NULL 3.2 越界访问动态内存空间 3.3 对非动态开辟的内存使用free释放 3.4 使用free只释放了…

IDM激活_powershelll

IDM激活 参考链接https://www.aybk.cn/post-2088.html 1&#xff1a;首先&#xff0c;从 IDM 网站下载 IDM 2&#xff1a;在电脑上安装 IDM 3&#xff1a;现在在 Windows 中搜索 "PowerShell "并打开 PowerShell 4&#xff1a;粘贴命令 irm https://massgrave.…

抖音视频评论自动回复与主动回复的实现

随着抖音平台的迅猛发展&#xff0c;视频内容创作者面临着日益增长的互动需求。用户评论作为互动的重要渠道之一&#xff0c;其管理与回复工作显得尤为重要。为了提高效率和互动质量&#xff0c;引入在线客服系统成为众多创作者和企业的选择。本文将详细介绍基于抖音开放平台接…

SVM向量支持机

1.通俗理解 svm&#xff1a;support vector machine目标&#xff1a;利用超平面将两类数据分割开来&#xff0c;这个超平面就是我们要设计的对象 如何设计&#xff1f;我们设计之后会有间隔&#xff0c;间隔越大分类效果就越好&#xff1b;距离决策边界最近的点我们成为支持向…

Python 将PowerPoint (PPT/PPTX) 转为HTML格式

PPT是传递信息、进行汇报和推广产品的重要工具。然而&#xff0c;有时我们需要将这些精心设计的PPT演示文稿发布到网络上&#xff0c;以便于更广泛的访问和分享。本文将介绍如何使用Python将PowerPoint文档转换为网页友好的HTML格式。包含两个示例&#xff1a; 目录 Python 将…

大数运算(加法和除法)

声明:写法是多样的&#xff0c;下面仅仅是我比较喜欢的写法。另外&#xff0c;这里的除法是高精/低精。实际题目里面&#xff0c;反正我没见过高精/高精的。 AB: #include <bits/stdc.h> using namespace std; const int inf 0x3f3f3f3f; #define ll long long int a[…

mongodb 实现两个集合的关联并分页查询

问题描述 实现两个集合的关联并分页查询。 假设&#xff1a; collection1中有deviceId等字段&#xff0c;collection2 中有deviceId、unitName等字段&#xff0c; 关联这两个colltion&#xff0c;并分页查询 代码实现 public ResponseEntity<String> getPageList(Reque…

实在智能受邀出席中国信通院金融智能体标准启动会作主题演讲

以大模型为代表的人工智能技术正深刻影响着金融服务的模式和流程&#xff0c;金融智能体在大模型的加持下&#xff0c;业务场景的应用能力得到强化&#xff0c;然而&#xff0c;作为新型技术&#xff0c;在隐私保护、透明性、数据泄露等方面仍存在诸多风险&#xff0c;为充分完…

Java 笔记 02:Java 开发环境的搭建,IDEA / Notepad++ / JDK 安装及环境配置,编写第一个 Java 程序

一、前言 记录时间 [2024-04-19] 系列文章简摘&#xff1a;Java 笔记 01&#xff1a;Java 概述&#xff0c;MarkDown 常用语法整理 本文介绍了 Java 开发环境的搭建&#xff0c;包括 JDK 、IDEA 这一系列开发工具的安装和环境参数配置&#xff1b;介绍了 Java 程序运行机制&am…

深度学习每周学习总结P5(运动鞋识别)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 –来自百度网盘超级会员V5的分享 目录 0. 总结1. 数据导入及处理部分2. 加载数据集3.模型构建部分3.1 模型构建3.2 公式推导 4. 设置超参…

OpenHarmony鸿蒙南向开发案例:【智能加湿器】

样例简介 智能加湿器具有实时监控其所处环境温度、湿度&#xff0c;并通过数字管家设置日程&#xff0c;自动打开加湿器控制湿度功能。显示界面使用DevEco Studio 编写的js应用&#xff0c;具有很好的兼容和移植特性。硬件上采用了带有HDF框架的驱动模型&#xff0c;通过GPIO和…

Linux 网络测速

1.开发背景 网络测速&#xff0c;为了测试开发板的网络速度是否达标的通用测试方法 2.开发需求 搭建 iperf3 &#xff0c;在 ubuntu 下安装服务端&#xff0c;在板卡上安装客户端&#xff0c;服务端和客户端互发 3.开发环境 ubuntu20.04 嵌入式开发板&#xff08;debian 千…

Stable Diffusion 3 API 发布!超越Midjourney v6和DALL-E 3

Stable Diffusion 3 于 2 月首次宣布作为预览版发布。而今天&#xff0c;StabilityAI 正式推出了 Stable Diffusion 3 和 Stable Diffusion 3 Turbo API 的API接口服务。 Stability AI 称仍在持续改进该模型&#xff0c;并没有说明发布日期。模型还没发布&#xff0c;但API先来…

【数据结构-串-数组-广义表】

目录 1 串-理解1.1 串的抽象定义&#xff1a;-理解1.2 串的存储结构-不断掌握1.2.1 顺序存储结构&#xff1a;1.2.2 链式存储结构&#xff1a; 1.3 串的模式匹配算法&#xff1a;-掌握1.3.1 BF暴力求解算法-代码 -掌握1.3.2 KMP求解算法-代码--掌握 2 数组-不断掌握2.1 顺序存储…

软考 - 系统架构设计师 - 质量属性例题

问题 1&#xff1a; 问题 2&#xff1a; 系统架构风险&#xff1a;m &#xff08;描述尚未达到共识就说明具有风险&#xff09; 敏感点&#xff1a;e &#xff08;敏感点是指为了实现某种特定的质量属性&#xff0c;一个或多个构件所具有的特征&#xff0c;对查询请求处理时间的…

ASP.NET MVC企业级程序设计 (接上个作品加了添加)

效果图 实现过程 控制器代码 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using MvcApplication1.Models; namespace MvcApplication1.Controllers {public class HomeController : Controller{//// GET:…

Ceph学习 -11.块存储RBD接口

文章目录 RBD接口1.基础知识1.1 基础知识1.2 简单实践1.3 小结 2.镜像管理2.1 基础知识2.2 简单实践2.3 小结 3.镜像实践3.1 基础知识3.2 简单实践3.3 小结 4.容量管理4.1 基础知识4.2 简单实践4.3 小结 5.快照管理5.1 基础知识5.2 简单实践5.3 小结 6.快照分层6.1 基础知识6.2…

react18 antd 引入导航栏之后一些bug,解决方法收集

概述&#xff1a; 我们开发react引入antd之后导航栏会出现刷新不选中、不展开二级导航栏、页面js点击之后不选中最新tab、只能展开一个二级tab之类的问题。那么我们一起来把问题给解决了 问题描述 其实问题这些问题差不多就是一个问题&#xff0c;就是Menu没有刷新选中的状态…

hyperf统一请求响应

2024年4月18日08:48:45 以下是两个方案&#xff1a; 1&#xff0c;使用注解&#xff0c;直接返回 <?phpnamespace App\Utils;use App\Utils\GlobalCode; use App\Utils\GlobalMsg; use Hyperf\Contract\ContainerInterface; use Hyperf\Di\Annotation\Inject; use Hyper…