UVA 11129(An antiarithmetic permutation)分治
程序员文章站
2022-06-06 20:41:27
...
题意:输入一个数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;
}