本文主要是介绍uva11129 - An antiarithmetic permutation(反算数级数),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
求不含任何等差数列的排列
我们只需把原有的等差数列打乱即可
在0-n-1中最大的等差数列是0,2,4,6……和1,3,5,7……
我们加入已经他们分别打乱,就是说前面的数字排列已经无需调整了
那么我们如何避免前后两部分的数组组成等差呢
只需把他们前后分开即可,
因为从这两部分中,你不可能拿出三个数等差排列。。
代码如下:
#include <cstdio>
#define M 10010
int n, a[M], b[M];
void dfs(int s, int t)
{int i = s;if(s+1>=t) return;for(int j = s; j <= t; j++) b[j] = a[j];for(int j = s; j <= t; j+=2,i++) a[i] = b[j];for(int j = s+1; j <= t; j+=2,i++) a[i] = b[j];dfs(s,(s+t)/2);dfs((s+t)/2+1,t);
}
int main ()
{int n;while(scanf("%d",&n),n){for(int i = 0; i < n; i++) a[i] = i;dfs(0,n-1);printf("%d:",n);for(int i = 0; i < n; i++) i?printf(" %d",a[i]):printf("%d",a[i]);printf("\n");}return 0;
}
这篇关于uva11129 - An antiarithmetic permutation(反算数级数)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!