规律题
要求生成一个1-n的序列,冒泡排序后每个数字都只交换两次
通过一个dp发现只要数列能够分成3*x+4*y的形式就可以生成
3位的[1,2,3]变成[3,2,1]
4位的[1,2,3,4]变成[3,4,1,2]
按照这个规律就可以了
#include <bits/stdc++.h>
using namespace std;
const int maxn = 110;
int f[maxn], n, a[maxn], l, r, x, y;
int main() {
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
scanf("%d", &n);
f[3] = 1;
f[4] = 1;
for (int i = 5; i <= n; i++) f[i] = f[i-3]+f[i-4];
printf("%d\n", f[n]);
if (f[n] != 0) {
x = 0;
while (1) {
if ((n-3*x)%4 == 0) {
y = (n-3*x)/4;
break;
}
x++;
}
l = 1;
for (int i = 1; i <= x; i++) {
r = l+2;
a[l] = l+2;
a[l+1] = l+1;
a[l+2] = l;
l = l+3;
}
for (int i = 1; i <= y; i++) {
r = l+3;
a[l] = l+2;
a[l+1] = l+3;
a[l+2] = l;
a[l+3] = l+1;
l = l+4;
}
for (int i = 1; i < n; i++) printf("%d ", a[i]);
printf("%d\n", a[n]);
}
}