题解 CF347A 【Difference Row】

呵呵侠

2020-08-15 17:26:28

Solution

为了方便表述,我将价格命名为 $price$ 。 那么可知: $price = a_1 - a_2 + a_2 - a_3 + a_3 - …… -a_{n - 1} + a_{n - 1} - a_n$ 此时我们发现,从 $a_2$ 到 $a_{n - 1}$ 的所有的数值都被一加一减抵消了,类似于整数裂项,结果就变成了第一项减去最后一项。 那么如果我希望结果尽可能地大,就必须要让最大的数放在最前面,最小的数放在最后面。 所以可以用 $\operatorname{sort}$ 函数来排序。 排序之后,先输出最后的数值,最后输出最前面的数值( $\operatorname{sort}$ 是从小到大排序)。 那中间呢? 实际上,按照字典序排序,其实就是从小到大排序。 所以代码如下: ```cpp #include <bits/stdc++.h> using namespace std; int n, a[110]; int main() { cin >> n; for(int i = 1; i <= n; i = i + 1) cin >> a[i]; sort(a + 1, a + 1 + n); cout << a[n] << " "; for(int i = 2; i < n; i = i + 1) cout << a[i] << " "; cout << a[1] << endl; return 0; } ``` 当然,也可以从大到小排序,代码如下: ```cpp #include <bits/stdc++.h> using namespace std; int n, a[110]; bool cmp(int a, int b) { return a > b; } int main() { cin >> n; for(int i = 1; i <= n; i = i + 1) cin >> a[i]; sort(a + 1, a + 1 + n, cmp); cout << a[1] << " "; for(int i = n - 1; i > 1; i = i - 1) cout << a[i] << " "; cout << a[n] << endl; return 0; } ``` $\mathtt{end}$ $\mathtt{Thank\ you\ for\ watching.}$