[GESP202312 五級] 烹飪問題

題目描述

N N N 種食材,編號從 0 0 0 N ? 1 N-1 N?1,其中第 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 0ai?2,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 231?1

  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;為…