2020牛客寒假算法基础集训营2 建通道

https://ac.nowcoder.com/acm/contest/3003/I

题意

  有 n 个星球,第 i 个星球有权值 vi
  任意两个星球之间均可以建立传送通道,不过花费并不一样。第 i 个星球与第 j 个星球的之间建立传送通道的花费是 lowbit(vivj)。
  要使这 n 个星球相互可达,需要的花费最少是多少。

题解

  位运算。首先将权值去重(权值相等的点连接代价为 0 ),设去重后有 m 个点,接下来找到最小的二进制位 k ,满足存在 vi 的这个二进制位是 0 且存在 vj 的这个二进制位是 1 ,答案就是 2^k×(m1) (相当于所有这位是 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;
}
posted @ 2020-02-18 15:59  Vivid-BinGo  阅读(147)  评论(0编辑  收藏  举报