2020牛客寒假算法基础集训营2 建通道
https://ac.nowcoder.com/acm/contest/3003/I
题意
有 n 个星球,第 i 个星球有权值 vi。
任意两个星球之间均可以建立传送通道,不过花费并不一样。第 i 个星球与第 j 个星球的之间建立传送通道的花费是 lowbit(vi⊕vj)。
要使这 n 个星球相互可达,需要的花费最少是多少。
题解
位运算。首先将权值去重(权值相等的点连接代价为 0 ),设去重后有 m 个点,接下来找到最小的二进制位 k ,满足存在 vi 的这个二进制位是 0 且存在 vj 的这个二进制位是 1 ,答案就是 2^k×(m−1) (相当于所有这位是 0 的点与 j 点连边,是 1 的点与 i 点连边)。
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int w,n,i,v1=0,v0=0x7fffffff;
long long ans=0;
set<int> seti;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&w);
seti.insert(w);
v1|=w;
v0&=w;
}
v1^=v0;
for(i=0;i<=30;i++)
{
if((1<<i)&v1)
{
ans=(seti.size()-1)*(1<<i);
break;
}
}
printf("%lld",ans);
system("pause");
return 0;
}