题目大意:给出一整数n,求长度为n的数组的几个全排列,将每个排列中的a[i]=i的个数记为固定系数,要求找一些排列,使每一排列的固定系数都小于之前的排列,问最多有几个排列,并输出排列个数
思路:对于原始排列,我们首先交换他最后两个元素,固定系数会-2,对于之后的每个排列,我们要求排列数最多的排列序列,就要使每次交换后固定系数变化尽可能小,最小就是-1,那如果我们每次都用一个没有交换过的序列与最后一个数交换,我们可以发现每次交换后固定系数都会-1,那么这样就可以得到一个
#include<bits/stdc++.h>
using namespace std;
int a[105];
int main()
{
int t;
cin >> t;
while (t--)
{
int n;
scanf("%d", &n);
printf("%d\n", n);//不难发现,排列的最大个数就等于n
for (int i = 1; i <= n; i++)
{//输出原始排列
a[i] = i;
printf("%d ", a[i]);
}
printf("\n");
for (int i = 1; i < n; i++)
{
swap(a[n], a[n - i]);//对于每个排列,交换第n个和第n-i个元素
for (int j = 1; j <= n; j++)
{
printf("%d ", a[j]);
}
printf("\n");
}
}
return 0;
}
排列数最多的排列序列