题目链接:https://ac.nowcoder.com/acm/contest/3003/I
知识点准备:
(图片来自:https://blog.csdn.net/qq_39416311/article/details/102762635)
官方题解:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n;
int v[220000];
int va,vo;
int k;
int ans;
int main()
{
cin>>n;
va=0x7fffffff;
for(int i=0;i<n;i++)
{
scanf("%d",&v[i]);
va&=v[i]; //va记录二进制中全部都为1的位置
vo|=v[i]; //vo记录二进制所有出现过1的位置
}
//引入vo和v1是为了防止所有的v[i]在最低二进制位数处都有1,这样就不成立了
//通过异或将这种情况排除
va^=vo;
sort(v,v+n);
//去重
v[n]=-1;
for(int i=0;i<n;i++)
k+=(v[i]!=v[i+1]);
for(int i=0;i<30;i++) //题目给出最大值为2^30,所有最大位数不会超过30
{
int cur=1<<i;
if(va&cur)
{
ans=cur*(k-1);
break;
}
}
cout<<ans<<endl;
return 0;
}
同样思路第二种写法:
摘自:https://blog.csdn.net/qq_21433411/article/details/104237927
关于unique函数用法:https://www.cnblogs.com/wangkundentisy/p/9033782.html
看到的这个解法,相对于题解会多耗一些时间,更适合像我这种小白能想出来的(官方题解太高大上了)
用stl中的unique去重,然后利用两个for循环,逐个遍历对于去重后的k个数里最小位数