zoukankan      html  css  js  c++  java
  • 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 }

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

  • 相关阅读:
    phpize使用方法
    PHP安装redis扩展
    lnmp 搭建后,nginx下php文件404但是html文件正常访问
    nginx配置https访问安装ssl证书
    Linux安装git最新版本
    微信公众号开发处理微信昵称带图片问题
    如何撰写技术文档
    Asp.Net Core 2.0实现HttpResponse中繁切换
    EF6.0 下sql语句自动生成的参数类型decimal(18,2)修改
    Windows注册表详解
  • 原文地址:https://www.cnblogs.com/byzsxloli/p/5408483.html
Copyright © 2011-2022 走看看