-
题解:将每一个数换成后一个比它大的数,最大的数换成最小的那一个,就行了。(或者每个数换成前一个比小的之类多可以)
考虑分两种情况讨论:
1.原子集没有最大的那个数:这就显然是个正确的,每个数都比之前的数要大,所以总和肯定要大;
2.原子集有最大的那个数:最大数改变后的值最整个里面最大的,然后你将这个子集去掉最大的那个数,剩下的变化量的和肯定要小于你最大值变为最小值的值,因为你之间肯定会有多余的空格(因为不能为全集)留着,所以肯定是可行的。
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
using namespace std;
#define INF 0x3f3f3f3f
#define N 2010
struct node {
int val;
int pos;
}a[N];
int b[N];
bool cmp(node a, node b)
{
if(a.val == b.val)
return a.pos < b.pos;
return a.val < b.val;
}
int main()
{
int n;
scanf("%d", &n);
for(int i = 1; i <= n; i++) {
cin >> a[i].val;
a[i].pos = i;
}
sort(a + 1, a + n + 1, cmp);
for(int i = 1; i <= n; i++)
b[a[i].pos] = i;
for(int i = 1; i <= n; i++) {
if(b[i] != n)
cout << a[b[i] + 1].val << " ";
else
cout << a[1].val << " ";
}
return 0;
}