视频讲解:[GESP202312 五级] 烹饪问题-信息学奥赛GESP等级考试真题解析
一、原题
题目描述
有 N 种食材,编号从 1 至 N,其中第 i 种食材的美味度为 ai。
不同食材之间的组合可能产生奇妙的化学反应。具体来说,如果两种食材的美味度分别为 x 和 y ,那么它们的契合度为 x and y。
其中,and 运算为按位与运算,需要先将两个运算数转换为二进制,然后在高位补足 ,再逐位进行与运算。例如,12 与 6 的二进制表示分别为 1100 和 0110 ,将它们逐位进行与运算,得到 0100 ,转换为十进制得到 4,因此 12 and 6=4。在 C++ 或 Python 中,可以直接使用 &
运算符表示与运算。
现在,请你找到契合度最高的两种食材,并输出它们的契合度。
输入格式
第一行一个整数 N,表示食材的种数。
接下来一行 N 个用空格隔开的整数,依次为 a1,⋯,aN,表示各种食材的美味度。
输出格式
输出一行一个整数,表示最高的契合度。
输入输出样例
输入 #1
3
1 2 3
输出 #1
2
输入 #2
5
5 6 2 10 13
输出 #2
8
说明/提示
样例解释 1
可以编号为 1,2 的食材之间的契合度为 2 and 3=2,是所有食材两两之间最高的契合度。
样例解释 2
可以编号为 3,4 的食材之间的契合度为 10 and 13=8,是所有食材两两之间最高的契合度。
数据范围
对于 40% 的测试点,保证 N ≤ 1,000;
对于所有测试点,保证 N ≤ ,0 ≤ ai ≤ 2,147,483,647。
二、做题思路
1)填充数据
cpp
//1)填充数据
//1.1)确定食材种类n
int n;cin>>n;
//1.2)填充每种食材的美味度
vector<int> foods;
for(int i=1;i<=n;i++){
int temp;
cin>>temp;
foods.push_back(temp);
}
2)寻找契合度最高的食材
cpp
//2)寻找契合度最高的食材
int max_val=0;
//2.1)从权重最高的31开始
for(int i=30;i>=0;i--){
//2.2)保证之前的契合度
int now=max_val|(1<<i);
//2.3)判断当前权重出现是否超过2
int count=0;
for(auto it:foods){
if((it&now)==now){
count++;
}
if(count>=2){
break;
}
}
//2.4)权重出现超过2,更新最大契合度
if(count>=2){
max_val=now;
}
}
三、答案
cpp
#include<bits/stdc++.h>
using namespace std;
int main(){
//1)填充数据
//1.1)确定食材种类n
int n;cin>>n;
//1.2)填充每种食材的美味度
vector<int> foods;
for(int i=1;i<=n;i++){
int temp;
cin>>temp;
foods.push_back(temp);
}
//2)寻找契合度最高的食材
int max_val=0;
//2.1)从权重最高的31开始
for(int i=30;i>=0;i--){
//2.2)保证之前的契合度
int now=max_val|(1<<i);
//2.3)判断当前权重出现是否超过2
int count=0;
for(auto it:foods){
if((it&now)==now){
count++;
}
if(count>=2){
break;
}
}
//2.4)权重出现超过2,更新最大契合度
if(count>=2){
max_val=now;
}
}
//3)输出
cout<<max_val;
}