建通道(思维题)

链接:https://ac.nowcoder.com/acm/contest/3003/I
来源:牛客网
 

时间限制:C/C++ 3秒,其他语言6秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

在无垠的宇宙中,有 n 个星球,第 i 个星球有权值 viv_ivi​。
由于星球之间距离极远,因此想在有限的时间内在星际间旅行,就必须要在星球间建立传送通道。
任意两个星球之间均可以建立传送通道,不过花费并不一样。第 i 个星球与第 j 个星球的之间建立传送通道的花费是 lowbit(vi⊕vj)\text{lowbit}(v_i\oplus v_j)lowbit(vi​⊕vj​),其中 ⊕\oplus⊕ 为二进制异或,而 lowbit(x)\text{lowbit}(x)lowbit(x) 为 x 二进制最低位 1 对应的值,例如 lowbit(5)=1,lowbit(8)=8\text{lowbit}(5)=1,\text{lowbit}(8)=8lowbit(5)=1,lowbit(8)=8。特殊地,lowbit(0)=0\text{lowbit}(0)=0lowbit(0)=0。
牛牛想在这 n 个星球间穿梭,于是――你需要告诉 牛牛,要使这 n 个星球相互可达,需要的花费最少是多少。

输入描述:

第一行,一个正整数 n 。
第二行,n 个非负整数 v1,v2,…,vnv_1,v_2,\dots,v_nv1​,v2​,…,vn​ 。
保证 1≤n≤2×1051\leq n\leq 2\times 10^51≤n≤2×105,0≤vi<2300\leq v_i < 2^{30}0≤vi​<230。

输出描述:

输出一行,一个整数表示答案。

示例1

输入

复制2 1 2

2
1 2

输出

复制1

1

说明

1、2\text{}1、21、2 号点之间建立通道,v1⊕v2=3,lowbit(3)=1v_1 \oplus v_2=3, \text{lowbit}(3)=1v1​⊕v2​=3,lowbit(3)=1

思路:

这个题就是个分奇偶 然后如果有奇有偶则输出去重后的(数量-1)
只考虑只有奇数和只有偶数的情况
我们可以把每个数不断 / 2直到第x次某一位有0 也有1  就说明在除了x后同时出现了奇数和偶数 那答案就是(总数-1) * (1 << x)
这个题手贱变量名打错了。。。

建通道(思维题)_第1张图片

打错的地方

代码:

#include
using namespace std;
typedef long long ll;
const int maxn=2e5+5;
int a[maxn];
int main(){
	ll n;
	cin>>n;
	int flag1=0,flag2=0;
	sets;
	for(int i=1;i<=n;i++){
	   scanf("%d",&a[i]);
	   if(a[i]%2==0)flag1=1;
	   if(a[i]%2==1)flag2=1; 
	   s.insert(a[i]);
	}
	ll m=s.size();
	if(flag1&&flag2){ 
		cout<<(m-1)<

 
 

 

你可能感兴趣的:(思维题)