给定一个正整数n,计算出一组{0,1,2,…,n}的排列,使得这个排列的任何子序列都不能形成等差数列。
想了很长时间就是没想出来,想用分治来解,可就是想不出来。后来在雪哥的提醒下,顿悟。
先把序列分成奇偶序列(实际就是把奇位置分成一组,偶位置分成一组),这两个序列之间不会形成等差序列,同样再在奇偶序列中再这样分,这样分就能保证不会出现等差序列
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int array[10010], tmp[10010];
void Dvide(int l, int r)
{
if(r - l <= 1) return ;
for(int i = l; i <= r; i++)
tmp[i] = array[i];
int i, j;
for(i = l, j = l; j <= r; j += 2, i++){
array[i] = tmp[j];
}
for(j = l + 1; j <= r; j += 2, i++){
array[i] = tmp[j];
}
Dvide(l, (l + r) / 2);
Dvide((l + r) / 2 + 1, r);
}
int main()
{
//freopen("input.txt", "r", stdin);
int n;
while(scanf("%d", &n) && n){
for(int i = 0; i < n; i++)
array[i] = i;
Dvide(0, n - 1);
printf("%d:", n);
for(int i = 0; i < n; i++)
printf(" %d", array[i]);
printf("\n");
}
return 0;
}