洛谷 [P10393 无限循环?] 题解

本题是一个推论题。

由题目给定的条件:

  • \(w_i=\dfrac12(a_i+a_{i+1})\)

  • \(w_n=\dfrac12(a_1+a_{n})\)

转化得到:

  • \(2w_i=a_i+a_{i+1}\)

  • \(2w_n=a_1+a_{n}\)

移项得:

  • \(a_i = 2w_i - a_{i+1}\)

  • \(a_n = 2w_i - a_{1}\)

然后,我们发现 \(a_{i+1}\) 可以按照上述推论转化为 \(a_{i+1} = 2w_{i+1} - a_{i+2}\)

即得到 \(a_i = 2w_i - (2w_{i+1} - a_{i+2})\)

我们重复此过程,并让起始的 \(i =1\),最终得到了这个式子:

  • \(a_1 = 2w_1 - (2w_2 - (2w_3 - (... - (2w_n - a1))))\)

由于 \(n\) 是奇数,那么我们就可以将这个式子整理为:

  • \(a_1 = 2w_1 - 2w_2 + 2w_3 - 2w_4 + 2w_5 ... +2w_n - a_1\)

把末尾 \(a_1\) 移项,并化简得:

  • \(a_1 = w_1 - w_2 + w_3 - w_4 + w_5 - w_6 ... + w_n\)

这时候我们就可以很轻松地利用给定的 \(w_i\) 去构造 \(a_1\) 的最大值/最小值了。

AC 代码

#include<bits/stdc++.h>
using namespace std;
int n, w[1000010];
signed main() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> w[i];
    }
    sort(w + 1, w + 1 + n);
    int i = n, j = 1;
    for (int now = 1; now <= n; now++) {
        if (now & 1) { // 奇数, +
            cout << w[i--] << " ";
        } else {
            cout << w[j++] << " ";
        }
    }
    cout << endl;
    i = 1, j = n;
    for (int now = 1; now <= n; now++) {
        if (now & 1) { // 奇数, +
            cout << w[i++] << " ";
        } else {
            cout << w[j--] << " ";
        }
    }
    return 0;
}
posted @ 2024-08-09 16:30  Shoukaku  阅读(29)  评论(0)    收藏  举报
//雪花飘落效果