题意:输入一个数n,输出0~n序列的一个排列,使得所有的子序列(三个或三个以上)都不构成等差数列。
思路:思路很强……每次将奇数位置的数放在一边,偶数位置的数放在一边(这样很神奇就不构成等差了,不知道为什么)
举个栗子!
n=5时
0 1 2 3 4
第一次操作:
0 2 4 | 1 3
第二次操作:
0 4 | 2 | 1 | 3
第三次操作:
0 | 4 | 2 | 1 | 3
注意到其实第二次操作后,0 4这个序列已经只有两个元素了,其实第三次操作时可以省略的
再举一个栗子!
n=6时
0 1 2 3 4 5 6
第一次操作:
0 2 4 | 1 3 5
第二次操作:
0 4 | 2 | 1 5 | 3
第三次操作:
0 | 4 | 2 | 1 | 5 | 3
上代码啦!
#include<bits/stdc++.h> #define LL long long using namespace std; int a[10000],b[10000]; void change(int l,int r) { if(r-l<=1) return ; for(int i=l;i<=r;i++) { b[i]=a[i]; } int i,j; for(i=l,j=l;j<=r;i++,j+=2) { a[i]=b[j]; } //i++; for(j=l+1;j<=r;j+=2,i++) { a[i]=b[j]; } // for(int i=1;i<=n;i++) change(l,(l+r)/2); change((l+r)/2+1,r); } int main() { int n; while(cin>>n&&n) { cout<<n<<':'; for(int i=0;i<n;i++) { a[i]=i; } change(0,n-1); for(int i=0;i<n;i++) { cout<<a[i]<<' '; } cout<<endl; } return 0; }