cf892 D. Gluttony
题意:
给定无重复数组 a,重排数组 a 得到数组 b,使得对于任一下标集 \(S\),都有 \(\sum\limits _S a_i \neq \sum\limits _S b_i\)
\(1\le n \le 22\)
思路:
看到 \(n\le 22\) 我的智商直接归零了,没想到是个简单构造
构造:若 \(a_i\) 是最大数,则 \(b_i\) 取最小数;否则,\(b_i\) 取刚好比 \(a_i\) 大的数
证明:若 \(S\) 不包含 a 中的最大数,则每个 \(b_i>a_i\),所以b的和也大于a的和;
若包含 a 中的最大数,则考虑 \(S\) 的补集,补集不等所以原集也不等
cin >> n;
for(int i = 1; i <= n; i++) cin >> a[i], S.insert(a[i]);
for(int i = 1; i <= n; i++) {
auto p = S.upper_bound(a[i]);
if(p == S.end()) p = S.begin();
cout << *p << ' ';
}

浙公网安备 33010602011771号