[CODEFORCES 892D Gluttony](https://codeforces.com/contest/892/problem/D) = ## 題目大意 給 $n$ 個**不重複**數 $a_1, a_2, \cdots, a_n$,構造一個 $a$ 數列的[排列](https://zh.wikipedia.org/wiki/%E7%BD%AE%E6%8F%9B) $b$, 使得對任意順序 $\forall k < n. x_1, x_2, \cdots, x_k$ 有 $\sum_{i=1}^k a_{x_i} \not= \sum_{i=1}^k b_{x_i}$ ## 輸入 $n$ $a_1, a_2, \cdots, a_n$ ## 輸出 $b_1, b_2, \cdots, b_n$ ## 解法 令 $\begin{cases} A = \sum_{i=1}^k a_{x_i} \\ B = \sum_{i=1}^k b_{x_i} \end{cases}$ 以及 $\begin{cases} C = \sum_{i=k+1}^n a_{x_i} \\ D = \sum_{i=k+1}^n b_{x_i} \end{cases}$ $A = B$ 若且唯若 $C = D$,因為 $A+C = B+D$ 為了使得 $A \not= B$,要設法保證 $C \not= D$ 最直接的方式就是讓 $\forall i > k. b_{x_i} > a_{x_i}$ 這樣一來,任意的 $D$ 都會大於 $C$ 了 > 也就是說有 $C \not= D$ 做法是先將 $a$ 由小至大**排序**,接著讓 $b_i = a_{i+1}$ 但這有個問題,從 $b_1$ 到 $b_{n-1}$ 設定完後,最終 $b_n$ 只能選擇 $a_1$ 幸好,題目要求選擇 $x$ 的方式是**對稱**的 就是說若發生 $\exists i > k. b_{x_i} = b_n < a_{x_i}$ 則 $\forall i \le k. b_{x_i} > a_{x_i}$ 那麼 $B$ 一定大於 $A$,這樣一來 $C \not= D$ 因為 $A+C = B+D$ ```cpp #include<bits/stdc++.h> using namespace std; int constexpr maxn = 25; int n, a[maxn], c[maxn]; int main() { cin >> n; for(int i = 0; i < n; i++) cin >> a[i], c[i] = a[i]; sort(c, c+n); for(int i = 0; i < n; i++) { int p = lower_bound(c, c+n, a[i]) - c; cout << c[(p+1)%n] << ' '; // b_i } cout << endl; return 0; } ```