UVA - 11129 An antiarithmetic permutation

题目大意:给出一个数值 n, 要求用 0~n - 1 这 n 个数组成一个序列,使得这个序列的所有长度大于 2 的子序列都不是等差数列


解题思路:只要对序列按奇偶位置分成两个序列,然后对两个子序列同样进行分类,最后排出来的一定是非等差数列

#include <cstdio>
#include <cstring>

int n, A[10005], T[10005];

void deal(int left, int right) {
	if (left == right)
		return;
	memcpy(T, A, sizeof(A));
	int cnt = left;
	for (int i = left; i <= right; i += 2)
		A[cnt++] = T[i];
	for (int i = left + 1; i <= right; i += 2)
		A[cnt++] = T[i];
	deal(left, (right + left)/2);
	deal((right + left)/2 + 1, right);
}

int main() {
	while (scanf("%d", &n), n) {
		for (int i = 0; i < n; i++)
			A[i] = i;
		deal(0, n-1);

		printf("%d:", n);
		for (int i = 0; i < n; i++)
			printf(" %d", A[i]);
		printf("\n");
	}
	return 0;
}


你可能感兴趣的:(UVA - 11129 An antiarithmetic permutation)