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

时间:2020-02-18
本文章向大家介绍2020牛客寒假算法基础集训营2 建通道,主要包括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;
}

原文地址:https://www.cnblogs.com/VividBinGo/p/12326577.html