题意:读入一个数n,代表从0到n-1的数列,让你输出一个数列,这个数列的子序列均不为等差数列
思路:= =参考了网上大神的代码,得到的一个规律:将等差(?)数列按奇偶位置分成两个数列,再重复这一步骤,最后得到的数列一定是非等差数列,其实就是分治法
ps:分治法:将大的问题分为无数个小问题,解决后再将得到的解合并,得到大问题的答案
例:0 1 2 3 4 5 6 7
->(0 2 4 8)(1 3 5 7) 此刻我们得到了两个小等差数列,但此时数列已不是等差数列了
->(0 4)(2 8)(1 5)(3 7)= =因为数列个数小于3,因而小数列已无法判断是否等差,但此刻数列已满足要求,即子序列不为等差数列
下面是代码:
1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 int num; 5 int n[10000],t[10000]; 6 bool datecin() 7 { 8 if(scanf("%d",&num)!=EOF&&num) 9 return true; 10 return false; 11 } 12 13 void dateins() 14 { 15 for(int i=0;i<num;i++)n[i]=i; 16 } 17 18 void datecal(int l,int r) 19 { 20 if(r-l<2) return ; 21 for(int i=l;i<=r;i++)t[i]=n[i]; 22 int c=l; 23 for(int i=l;i<=r;i+=2) n[c++]=t[i]; 24 for(int i=l+1; i<=r; i+=2) n[c++]=t[i];//排序数列里的值 25 datecal(l,(l+r)/2);//对左子序列排序 26 datecal((l+r)/2+1,r);//对右子序列排序 27 } 28 29 void showres() 30 { 31 printf("%d:",num); 32 for(int i=0;i<num;i++) 33 { 34 printf("%d",n[i]); 35 if(i!=num-1) 36 printf(" "); 37 } 38 printf("\n"); 39 } 40 41 int main() 42 { 43 while(datecin()) 44 { 45 dateins(); 46 datecal(0,num-1); 47 showres(); 48 } 49 return 0; 50 }
答案有多种,应该是有其他的方法,后面再找一找。
时间: 2024-09-29 21:12:50