题目描述

N N N 种食材,编号从 0 0 0 N − 1 N-1 N1,其中第 i i i 种食材的美味度为 a i a_i ai

不同食材之间的组合可能产生奇妙的化学反应。具体来说,如果两种食材的美味度分别为 x x x y y y ,那么它们的契合度为 $x\ \text{and}\ y $。

其中, and \text{and} and 运算为按位与运算,需要先将两个运算数转换为二进制,然后在高位补足 ,再逐位进行与运算。例如, 12 12 12 6 6 6 的二进制表示分别为 1100 1100 1100 0110 0110 0110 ,将它们逐位进行与运算,得到 0100 0100 0100 ,转换为十进制得到 4,因此 12 and  6 = 4 12 \text{ and } 6 = 4 12 and 6=4在 C++ 或 Python 中,可以直接使用 & 运算符表示与运算。

现在,请你找到契合度最高的两种食材,并输出它们的契合度。

输入格式

第一行一个整数 N N N,表示食材的种数。

接下来一行 N N N 个用空格隔开的整数,依次为 a 1 , ⋯ , a N a_1,\cdots,a_N a1,,aN,表示各种食材的美味度。

输出格式

输出一行一个整数,表示最高的契合度。

输入输出样例 #1

输入 #1

3
1 2 3

输出 #1

2

输入输出样例 #2

输入 #2

5
5 6 2 10 13

输出 #2

8

说明/提示

样例解释 1

可以编号为 1 , 2 1,2 1,2 的食材之间的契合度为 2 and  3 = 2 2\ \text{and} \ 3=2 2 and 3=2,是所有食材两两之间最高的契合度。

样例解释 2

可以编号为 3 , 4 3,4 3,4 的食材之间的契合度为 10 and  13 = 8 10\ \text{and}\ 13=8 10 and 13=8,是所有食材两两之间最高的契合度。

数据范围

对于 40 % 40\% 40% 的测试点,保证 N ≤ 1 , 000 N \le 1,000 N1,000

对于所有测试点,保证 N ≤ 10 6 N \le 10^6 N106 0 ≤ a i ≤ 2 , 147 , 483 , 647 0\le a_i \le 2,147,483,647 0ai2,147,483,647

提交链接

烹饪问题

思路分析

对于 40 % 40\% 40% 的测试点:

暴力算法( 100 % 100\% 100% 的数据会超时)

枚举所有 ( i , j ) (i, j) (i,j) 组合,复杂度 O ( N 2 ) O(N^2) O(N2),在 n = 10 6 n=10^6 n=106 时会超时

#include <bits/stdc++.h>
using namespace std;int n, a[1000009];int main()
{cin >> n;for (int i = 1; i <= n; i++)cin >> a[i];int mx_and = 0;for (int i = 1; i <= n; i++)for (int j = i + 1; j <= n; j++)mx_and = max(mx_and, a[i] & a[j]);cout << mx_and;return 0;
}

对于 100 % 100\% 100% 的测试点:

思路1:

AND 运算结果的大与小由高位决定:高位为 1 1 1 越多,结果越大。我们从高位往低位贪心,希望两个数在高位尽可能都为 1 1 1

我们可以:

  1. 遍历 31 ∼ 0 31 \sim 0 310 位(因为数据范围不超过 2 31 − 1 2^{31}-1 2311

  2. 每次筛出当前位为 1 1 1 的数集合

  3. 如果这集合里数量 ≥ 2 ≥ 2 2,就只保留它们继续往低位考虑

  4. 最终从这些数中找一组最大 AND 值

主逻辑

int mx_and = 0;
for(int pos = 31; pos >= 0; pos--) {int num = check_and(1, n, pos);if(num >= 2) {mx_and |= (1 << pos);n = num;}
}

从最高位 31 31 31 递减到最低位 0 0 0,逐位处理:for(int pos = 31; pos >= 0; pos--)

每次调用 check_and 将数组按照该位是否为 1 1 1 重新划分:int num = check_and(1, n, pos);

如果划分后,第 p o s pos pos 位为 1 1 1 的数不少于 2 2 2 个,则将该位保留在答案中,同时更新数组范围只保留这部分数,继续判断下一位,如果不足两个数,则该位不能保留。

if(num >= 2) 
{mx_and |= (1 << pos);n = num;
}

关键函数解析:check_and

int check_and(int l, int r, int bit) 
{int i = l, j = r;while (i <= j) {// 左指针跳过第 bit 位为 1 的数while (i <= j && ((a[i] >> bit) & 1)) i++;// 右指针跳过第 bit 位为 0 的数while (i <= j && !((a[j] >> bit) & 1)) j--;if (i < j) swap(a[i++], a[j--]);}return j;
}

该函数将数组 [ l . . r ] [l..r] [l..r] 中的元素根据第 b i t bit bit 位分为两部分:

  • 左半部分是第 b i t bit bit 位为 1 1 1 的数。

  • 右半部分是第 b i t bit bit 位为 0 0 0 的数。

返回值 j j j 表示第 b i t bit bit 位为 1 1 1 的数所在区间的最后一个位置。

完整代码

#include<bits/stdc++.h>
using namespace std;int n , a[1000009];int check_and(int i , int j , int bit)
{while(i <= j){while(i <= j && a[i] >> bit & 1) i++;while(i <= j && !(a[j] >> bit & 1))j--;if(i <= j)	swap(a[i++] , a[j--]);}return j;
}
int main()
{cin >> n;for(int i = 1; i <= n; i++)cin >> a[i];int mx_and = 0;for(int pos = 31; pos >= 0; pos--){int num = check_and(1 , n , pos);if(num >= 2){mx_and |= 1 << pos;n = num;}}cout << mx_and;return 0;
}

思路2:

从数组中取出最大的 32 32 32 个数,然后在它们之间暴力两两组合,求最大 a[i] & a[j]

  1. AND 的值由高位影响最大

    因为 AND 运算中,只有两个数该位都是 1 1 1,结果才是 1 1 1,所以想让结果最大,就要让两个数在高位尽量都是 1 1 1。高位相同的数才更容易 AND 出更大的数。

  2. 越大的数,高位 1 1 1 越可能多

    数值大的数,二进制中左侧(高位)出现 1 1 1 的概率更高,所以最大 AND 通常出现在“比较大的两个数”之间。

  3. 最多 32 32 32 个不同高位组合

    因为 i n t int int 32 32 32 位,最多有 32 32 32 个不同的“最高位为 1 1 1”的模式,所以只取最大 32 32 32 个数,就等于把每一种高位代表的结构都涵盖了。

参考代码

#include<bits/stdc++.h>
using namespace std;int n , a[1000009];int main()
{cin >> n;for(int i = 1; i <= n; i++)cin >> a[i];sort(a + 1 , a + n + 1 , greater<int>());n = min(n , 32);int mx_and = 0;for(int i = 1; i <= n; i++)for(int j = i + 1; j <= n; j++)mx_and = max(mx_and , a[i] & a[j]);cout << mx_and;return 0;
}

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

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

相关文章

JSON Mock 工具:从接口模拟到前端联调(二)

JSON Mock 工具&#xff1a;模拟JSON API 接口&#xff08;一&#xff09;-CSDN博客 上一篇学习到&#xff0c;JSON Mock 工具&#xff0c;是用于模拟返回 JSON 数据的 API 接口&#xff0c;解决后端接口未就绪时前端无法开发测试的问题&#xff0c;实现 “无后端依赖” 的前端…

质量小议55 - 搜索引擎与AI

先有搜索引擎(谷歌、百度)&#xff0c;后有AI(chatGPT&#xff0c;deepSeek&#xff0c;文心一主&#xff0c;CSDN助手) 慢慢的百度用的少了&#xff0c;更多的是直接向AI工具提问 虽然搜索引擎也有了AI版的结果&#xff0c;而且是置顶的&#xff0c;但更多的时间在用A…

Life:Internship in OnSea Day 0

Prolog This will be a new serial Blog to record my internship life in OnSea(I like this straightly translation of hell divers). As usual&#xff0c;这些 Blogs 主要还是给 自分自身 看的&#xff0c;以便日后考古自己的 career。 既然已经这个系列归类到了 Life 类…

ChangeNotifierProvider 本质上也是 Widget

场景 void main() {runApp(MyApp()); }class MyApp extends StatelessWidget {const MyApp({super.key});overrideWidget build(BuildContext context) {return ChangeNotifierProvider(create: (context) > MyAppState(),child: MaterialApp(title: Namer App,theme: Them…

【软考高级系统架构论文】论负载均衡技术在Web系统中的应用

论文真题 负载均衡技术是提升Web系统性能的重要方法。利用负载均衡技术&#xff0c;可将负载(工作任务)进行平衡、分摊到多个操作单元上执行&#xff0c;从而协同完成工作任务&#xff0c;达到提升Web系统性能的目的。 请围绕“负载均衡技术在Web系统中的应用”论题&#xff…

pyqt5工具-串口调试工具

目录 功能界面代码功能 串口设置:支持选择串口、波特率、数据位、停止位和校验位 串口操作:扫描串口、打开 / 关闭串口连接 数据收发: 支持文本和 Hex 模式显示与发送 可设置自动添加换行符 接收区自动滚动 支持中文显示 辅助功能:清空接收区、状态栏显示连接状态 多串口管…

Mybatis-Plus支持多种数据库

使用Mybatis-Plus进行数据库的访问&#xff0c;但是由于不同的数据库有不同的方言&#xff0c;所以需要进行适配。 有2种实现方式&#xff1a; databaseId方式Mapper Location方式 指定databaseId方式 通过databaseId指定所使用的数据库&#xff0c;选择同步的SQL。 Mappe…

【系统分析师】2018年真题:综合知识-答案及详解

【第1题】 面向对象分析中&#xff0c;对象是类的实例。对象的构成成分包含了&#xff08;1&#xff09;&#xff0c;属性和方法&#xff08;或操作&#xff09;。 (1)A.标识 B.消息 C.规则 D.结构 【解析】本题考查的是面向对象的基本概念 对象的三要素为&#xff1a;属性…

从Git历史中删除大文件的完整解决方案

从Git历史中删除大文件的完整解决方案 当你意外提交了一个大文件导致无法推送到远程仓库时&#xff0c;可以按照以下步骤彻底从Git历史中删除这个大文件。 情况分析 首先确认你的问题属于以下哪种情况&#xff1a; 大文件在最近一次提交中&#xff1a;相对容易处理大文件在…

[xiaozhi-esp32] 应用层(9种state) | 音频编解码层 | 双循环架构

第三章&#xff1a;应用层 在第一章&#xff1a;开发板抽象层中&#xff0c;我们实现了硬件交互标准化&#xff1b;在第二章&#xff1a;通信协议层中&#xff0c;我们构建了云端通信桥梁。 现在需要将这些能力有机整合——这便是应用层的使命 应用层的本质 应用层是设备的…

Java 锁升级的过程详解

Java 锁升级的过程详解 Java 虚拟机(JVM)为了提高多线程并发的效率,对内置锁(synchronized 关键字)的实现进行了一系列优化。这些优化体现在锁的升级过程中,即当竞争程度从低到高变化时,锁的状态会从偏向锁逐渐升级为轻量级锁,最终升级为重量级锁。这个过程是不可逆的…

使用vitis tcl脚本构建vitis app工程

一&#xff1a;最近重新学习了zynq系列开发&#xff0c;想着使用tcl创建工程&#xff0c;因此分享一下脚本例子 #!/bin/bashsource /tools/Xilinx/Vitis/2022.2/settings64.sh cd ../../ . ./script/project.sh cd app/script #tcl脚本只能在虚拟机桌面执行 xsct build_vitis…

电脑商城--购物车

加入购物车 1 购物车-创建数据表 1.使用use命令先选中store数据库。 USE store; 2.在store数据库中创建t_cart用户数据表。 CREATE TABLE t_cart (cid INT AUTO_INCREMENT COMMENT 购物车数据id,uid INT NOT NULL COMMENT 用户id,pid INT NOT NULL COMMENT 商品id,price BIG…

2024-2025学年度下期《网页设计》期末模拟测试

一、 单选题 1. HTML文档的根标签是( ) A. <html> B. <head> C. <body> D. <!DOCTYPE> 2. 用于定义段落内容的标签是&#xff1a;( ) A. <div> B. <p> C. <span> D. <br> 3. 网以下哪个属性用于定义CSS内联样式…

搭建加解密网站遇到的问

本机向云服务器传输文件 用winscp 服务器在安装 SSH 服务时自动生成密钥对&#xff08;公钥私钥&#xff09; 为什么要有指纹验证&#xff1f; 防止中间人攻击&#xff08;Man-in-the-Middle&#xff09; 指纹验证打破这个攻击链&#xff1a; 小问题 安装python时 ./confi…

CSS 制作学成在线网页

1 项目结构 1.1 总结 2 网页制作思路 3 header 区域 - 布局 3.1 通栏 3.2 logo 3.3 导航 3.4 搜索区域 3.5 用户区域 4 banner 区域 4.1 左侧侧导航 4.2 右侧课程表 5 精品推荐 6 推荐课程区域 参考链接&#xff1a; 82-准备工作-项目目录与版心_哔哩哔哩_bilibili

图灵完备之路(数电学习三分钟)----门的多路化

上一章中我们学习了如何用与非门实现其他逻辑门&#xff0c;但上节中的输入信号始终为2&#xff0c;但在现实中&#xff0c;输入的信号数量是不确定的&#xff0c;所以我们需要设计多输入的门&#xff1a; 1.三路与非门&#xff08;卡诺图法&#xff09; 我们还是从与非门开始…

【前端】二进制文件流下载(get、post)再谈一次

最近二进制文件流下载可谓是又出幺蛾子&#xff0c;翻阅以前的文章也找不到解决方案&#xff0c;感觉还是没用完全理解&#xff0c;这次再整理一遍。 先说一个通用场景&#xff0c;就是无论get还是post在接口请求的时候设定好 headers: { Content-Type: application/json;cha…

uv功能介绍和完整使用示例总结

以下是关于 UV 工具的完整使用示例总结,结合其核心功能与典型场景,帮助用户快速上手并高效管理 Python 项目: 一、安装与配置 快速安装 macOS/Linux:curl -LsSf https://astral.sh/uv/install.sh | shWindows:powershell -ExecutionPolicy ByPass -c "irm https://as…

MySQL启动报错“mysqld_safe Directory ‘/var/lib/mysql‘ don‘t exists“终极解决方案!从入门到高阶全攻略

在MySQL的使用过程中&#xff0c;启动报错mysqld_safe Directory /var/lib/mysql dont exists是开发者经常遇到的问题。这个错误看似简单&#xff0c;实则可能涉及目录权限、系统配置、文件系统等多个方面。本文将结合官方文档与实际经验&#xff0c;从基础到高级&#xff0c;为…