uva11129

来源:互联网 发布:乌鲁木齐seo 公司 编辑:程序博客网 时间:2024/06/17 06:49

就是给出一个数字n然后把0 到 n-1排个序,要求任意三个数字组成的子序列都不是等差的。


我们可以把奇数位上的排成一个序列,偶数位上的排成一个序列。

例如0 1 2 3 4 5 6 排成

0 2 4 6 1 3 5

这样的话前半段是等差,后半段是等差,但是前后两段就不能构成等差了。

这样再把前半段做这样的操作,后半段也做这样的操作。知道序列长度小于等于2之后。

这样就去安排好了。


AC代码:


#include<iostream>#include<algorithm>using namespace std;const int N =10000 + 5;int num[N];int temp[N];int n;void solve (int start ,int end) {for (int i = 0 ; i < n ;i++) {num[i] = temp[i];}if (end - start <= 2)return ;int j = start;for (int i = start; i < end ;i += 2,j++) {temp[j] = num[i];}for (int i = start + 1 ; i < end; i += 2,j++) {temp[j] = num[i];}solve(start , (start + end + 1) / 2);solve((start + end + 1) /2  , end );}int main () {while (cin >> n && n) {for (int i = 0 ; i < n ;i++) {temp[i] = i;}solve(0 ,n);cout << n << ":";for (int i = 0 ; i < n ; i++) {cout <<" " <<num[i] ; }cout <<endl;}}

 

0 0
原创粉丝点击