题解 CF347A 【Difference Row】
呵呵侠
2020-08-15 17:26:28
为了方便表述,我将价格命名为 $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.}$