题意:给出n,让你把0,1,2,3...n排序,使其的子序列(>=2)都是非等差数列。
额,这边有个trick,只要对序列按奇偶位置分成两个序列,然后对两个子序列同样进行分类,最后排出来的一定是非等差数列。
代码:
/*
* Author: illuz <iilluzen[at]gmail.com>
* Blog: http://blog.youkuaiyun.com/hcbbt
* File: uva11129.cpp
* Lauguage: C/C++
* Create Date: 2013-09-04 21:40:25
* Descripton: UVA 11129 An antiarithmetic permutation, partitation
*/
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define rep(i, n) for (int i = 0; i < (n); i++)
const int MAXN = 10010;
int n, a[MAXN], t[MAXN];
void solve(int l, int r) {
if (r == l) return;
memcpy(t, a, sizeof(a));
int j = l;
for (int i = l; i <= r; i += 2, j++)
a[j] = t[i];
for (int i = l + 1; i <= r; i += 2, j++)
a[j] = t[i];
solve(l, (l + r) / 2);
solve((l + r) / 2 + 1, r);
}
int main() {
while (scanf("%d", &n) && n) {
rep(i, n) a[i] = i;
solve(0, n - 1);
printf("%d:", n);
rep(i, n) printf(" %d", a[i]);
printf("\n");
}
return 0;
}