CF135A Replacement 题解

Content

\(n\) 个数 \(a_1,a_2,a_3,...,a_n\),试用 \(1\) ~ \(10^9\) 之间的数(除了本身)代替其中的一个数,使得这 \(n\) 个数的总和最小,并将数组按照非降序输出。

数据范围:\(1\leqslant n\leqslant 10^5,1\leqslant a_i\leqslant 10^9\)

Solution

首先我们排序一遍之后就可以找到最大的数,然后很显然,修改得要从最大的数入手。

然后我们需要分类讨论一下:

  1. 当最大的数为 \(1\),此时需要将这个最大的数修改为 \(2\) 才能符合要求。
  2. 否则,直接将最大的数修改为 \(1\) 即可。

修改完之后再排序一遍即可得到我们需要的数组。

Code

#include <cstdio>
#include <algorithm>
using namespace std;

int n, a[100007];

int main() {
	scanf("%d", &n);
	for(int i = 1; i <= n; ++i)
		scanf("%d", &a[i]);
	sort(a + 1, a + n + 1);
	a[n] = (a[n] == 1 ? 2 : 1);
	sort(a + 1, a + n + 1);
	for(int i = 1; i <= n; printf(" "), ++i)
		printf("%d", a[i]);
}
posted @ 2021-12-21 20:29  Eason_AC  阅读(13)  评论(0)    收藏  举报