UVA, 11129 An antiarithmetic permutation

题意:读入一个数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("
");
39 }
40 
41 int main()
42 {
43     while(datecin())
44     {
45         dateins();
46         datecal(0,num-1);
47         showres();
48     }
49     return 0;
50 }

答案有多种,应该是有其他的方法,后面再找一找。

原文地址:https://www.cnblogs.com/byzsxloli/p/5408483.html