题目链接:A - Min Or Sum
题目描述:
样例:
样例解析:
题意:给定一个数组a,可以再其中任选两个值 ai和aj,用x和y对这两个值进行替换,但需要满足ai|aj=x|y,其中|表示按位OR运算,使数组的和变为最小的。
思路:任何数与0通过按位OR运算都等于那一个数这个规律来进行推导,暴力跑双for,通过寻找,如果发现ai+aj的和如果大于ai|aj,那么就进行替换,最终使数组的和为最小。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=200005;
ll a[N];
ll t,n;
int main(){
ios::sync_with_stdio(false);
while(cin>>t){
while (t--){
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
ll ans=a[i]|a[j];
if(ans<a[i]+a[j]){
a[i]=0;
a[j]=ans;
}
}
}
ll num=0;
for(int i=0;i<n;i++){
num+=a[i];
}
cout<<num<<endl;
}
}
return 0;
}