题意:
输入一个数n,求n的一个排列,要求这个排序的任意一个子序列都不能是等差数列。
思路:
想了很久,但是除了枚举以外还是没想到其它的思路,枚举是一定会超时的;到网上看了别人的解题报告
才知道应该用分治的方法做。
分治的思想:考虑一个等差数列,我们把其奇数项,偶数项都提取出来;显然这两个序类内部还是等差数列,但是
它们之间的元素就不可能形成等差数列了;然后我们可以对得到的两个序列再进行同样的划分。。。。。这样多次划分以后就可以保证整个序列没有子序列为等差数列了。
代码如下:
#include<iostream> #include<cstring> #include<cstdio> using namespace std; int a[11000],b[11000]; void divide(int x,int y) { int i,j; if(y-x<=1) return ; for(i=x;i<=y;i++) b[i]=a[i]; ///提取偶数项 for(i=x,j=x;j<=y;j+=2,i++) a[i]=b[j]; ///提取奇数项 for(j=x+1;j<=y;j+=2,i++) a[i]=b[j]; divide((x+y)/2+1,y); divide(x,(x+y)/2); } int main() { int i,j,n; while(scanf("%d",&n)&&n) { for(i=0;i<n;i++) a[i]=i; divide(0,n-1); printf("%d:",n); for(i=0;i<n;i++) printf(" %d",a[i]); printf("\n"); } return 0; }
时间: 2024-11-03 22:11:00