Minimum Cost Perfect Matching
问题分析
求一个
的排列满足使得
之和最小。
那么我们考虑对每一位按位取反就可以了呀~
emm,代码借鉴一位过题大佬的,越看这个操作就越感觉,
妙啊~
看不懂的自己拿纸换成二进制算一下嘛~
#include<cstdio>
int a[500000];
int main() {
int n;
scanf("%d", &n);
for (int i = n - 1; i >= 0; --i) {
for (int j = 19; j >= 1; --j) {
int t = (1 << j) - 1;
if ((t ^ i) < n && a[t ^ i] == 0) {
a[t ^ i] = i;
break;
}
}
}
for (int i = 0; i < n; ++i)
printf("%d%c", a[i], i == n - 1 ? '\n' : ' ');
return 0;
}