鏈接: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;
}