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 << ' ';
}
posted @ 2022-04-01 18:25  Bellala  阅读(52)  评论(0)    收藏  举报