您的位置:首页 > 教育 > 锐评 > 医疗网络营销方式_企业创新平台建设_友情链接举例_贵阳网站建设推广

医疗网络营销方式_企业创新平台建设_友情链接举例_贵阳网站建设推广

2025/5/9 8:52:27 来源:https://blog.csdn.net/yuyanjingtao/article/details/144315977  浏览:    关键词:医疗网络营销方式_企业创新平台建设_友情链接举例_贵阳网站建设推广
医疗网络营销方式_企业创新平台建设_友情链接举例_贵阳网站建设推广

题目传送门

B3930 [GESP202312 五级] 烹饪问题

题目描述

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 12and6=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 ≤ 1 0 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

思路1:管他三七二十一,先写一版再说,按题目描述直接就是干,双层循环,n的范围: n < = 1 0 6 n<=10^6 n<=106,毫无疑问超时。五级之后的题目只要你写,基本不会1分不得,但想拿满分,不动动脑子是不行的。

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

思路2:题目给出了ai的范围, 0≤ai ≤2147483647,int类型(32位)可以存下的数,最左边符号位,把最右边算作0位,则表示数的最高位下标是30。两种食材的契合度是使用按位与运算得到的,按位与:都是1才是1,则契合度的值也必定是一个int类型能存储的值,且 1 越靠左边出现,该值越大 。

可以从最高位开始枚举,如果有两个以上的数截止到第i位都相同,则契合度res这一位可为1,否则,契合度res这一位为0。

#include <bits/stdc++.h>
using namespace std;
const int N=1e6;
int n, arr[N];//美味度
int main() {cin >> n;for (int i = 1; i <= n; i++) cin>>arr[i];int res=0, tmp=pow(2,30);for(int i=30; i>=0; i--) {res+=tmp;    //预置res的 i 位为1int cnt=0;for(int j=1; j<=n; j++) {//如果 (a[j]&res)==res 成立,意味着a[j]和res截止到第i位都相同if ((arr[j]&res)==res) cnt++;}if (cnt<2) { //cnt<2 意味着没有或者只有1个数截止到第i位和res相同,无法通过按位与使得res的第i位为1,置res的 i 位为0res-=tmp;}tmp >>= 1; //用右移实现除2}cout<<res;return 0;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com