洛谷 [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;
}

浙公网安备 33010602011771号