CF1728B Best Permutation
考虑对权值产生贡献的数在哪里。
显然对于一个排列 ,我们设 为最大的下标位置,且进行到 时 。那么对答案有影响的是 到 。
第一个结论, 至 严格单调递增。若存在 ,那么进行到 时, 一定会重新赋值为 。
第二个结论,排列最终权值 ,进行到 时,如果 ,那么 ,不然 。显然最终的 。
至此很好想,只需要令 即可,答案是最大的。
然而我们还需要构造 至 :
若 ,令 。这里的 表示下标,且 。可以发现 和 , 和 ,,两两抵消。
若 ,考虑在 的前面构造 ,这时剩下的就是偶数,按照上述情况做即可。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
const int N = 105;
int n, a[N], t;
int main()
{
scanf("%d", &t);
while (t--)
{
scanf("%d", &n);
if (!(n & 1))
{
int cur = 1;
while (cur < n - 1)
{
a[cur] = n - (cur + 1);
cur++;
}
a[n - 1] = n - 1;
a[n] = n;
for (int i = 1; i <= n; i++) printf("%d ", a[i]);
printf("\n");
}
else
{
if (n == 5) printf("1 2 3 4 5\n");
else
{
a[1] = 1, a[2] = 2, a[3] = 3;
int cur = 4;
while (cur < n - 1)
{
a[cur] = n - (cur - 2);
cur++;
}
a[n - 1] = n - 1;
a[n] = n;
for (int i = 1; i <= n; i++) printf("%d ", a[i]);
printf("\n");
}
}
}
return 0;
}

浙公网安备 33010602011771号