建通道(思維題)

鏈接: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)
這個題手賤變量名打錯了。。。

打錯的地方

代碼:

#include<bits/stdc++.h>
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;
	set<int>s;
	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)<<endl;
	}
	else{
		ll ans;
		int k=0;
	    for(int i=1;i<=30;i++){
	    	int flag11=0,flag22=0;
	    	for(int j=1;j<=n;j++){
			a[j]/=2;
			if(a[j]%2==0)flag1=1;
	        if(a[j]%2==1)flag2=1; 
		   }
		   if(flag11&&flag22){
		     k=i;
		     break;
		   }
	    }
	    if(k==0){
	    	cout<<"0"<<endl; 
		}
		else{
            ll xx=(1<<k);
			ans=(m-1)*xx;
			cout<<ans<<endl;
		}   
	}
	return 0;
} 

 
 

 

發佈了330 篇原創文章 · 獲贊 368 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章