朋友题解
题解
1.题目分析
这道题是一道经典的邻项交换题。很明显,我们会发现,在\(a\)的位置都不变时,我们如果交换相邻的两个\(b\)就会发现这样做只影响了这两对朋友交友后的快乐值。具体地,如果\(a_i\)和 \(a_{i+1}\)的值不变,交换\(b_i\)和 \(b_{i+1}\),就只会改变\(a_i \oplus b_i\) 和\(a_{i +1}\oplus b_{i+1}\)的值。
2.实现方法
有了上面的分析,我们不难发现,如果\(a_i\oplus b_i+a_{i+1}\oplus b_{i+1}<a_i\oplus b_{i+1}+a_{i+1}\oplus b_i\)时,我们就交换\(b_i\)和 \(b_{i+1}\)。
3.代码
\(Code:\)
#include<bits/stdc++.h>
#include<cstdio>
using namespace std;
const int N=1E6+5;
int n;
long long a[N],b[N];
struct node{
long long id,val;
}c[N];
bool cmp(const node&u,const node&v){
return (a[u.id]^u.val)+(a[v.id]^v.val)>(a[u.id]^v.val)+(a[v.id]^u.val);
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
cin>>b[i];
c[i].id=i;
c[i].val=b[i];
}
sort(c+1,c+n+1,cmp);
long long ans=0;
for(int i=1;i<=n;i++){
ans+=(a[c[i].id]^c[i].val);
}
cout<<ans;
}
浙公网安备 33010602011771号