uva--11129An antiarithmetic permutation+分治

题意:

输入一个数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

uva--11129An antiarithmetic permutation+分治的相关文章

uva:11129 - An antiarithmetic permutation(分治法)

题目:11129 - An antiarithmetic permutation 题目大意:求n的反算术级数.就是排序0 ..n - 1 要求不存在长度大于2的序列.例如:5的序列排列后(0, 5, 4, 3, 1, 2) ,但是(0,1,2)是一个等差序列,同样的还有(5,4,3), (5,3,1)... 解题思路:这题需要找到排列的策略:将整个序列分成差不多等长的两个部分,使得左右两部分各自成为等差数列,这样左边的数和右边的数组合就一定不会出现等差数列.然后把这个作为子问题,递归求解.递归到

uva 11129 An antiarithmetic permutation (递归)

uva 11129 An antiarithmetic permutation A permutation of n+1 is a bijective function of the initial n+1 natural numbers: 0, 1, ... n. A permutation p is called antiarithmetic if there is no subsequence of it forming an arithmetic progression of lengt

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

UVa 1411 Ants(分治)

https://vjudge.net/problem/UVA-1411 题意:n只蚂蚁和n颗苹果树,一一配对并且不能交叉. 思路:这就是巨人与鬼的问题.用分治法就行了. 1 #include<iostream> 2 #include<algorithm> 3 #include<set> 4 using namespace std; 5 6 int n; 7 const int maxn = 205; 8 9 int vis[maxn]; 10 11 struct nod

UVA 11027 - Palindromic Permutation

题目意思为解码字符串,要输出第n个回文字符串,因为对称关系,前一半确定了,后一半也就跟着确定了,所以n其实就是前一半字符串的编码,还要减去1,直接解码出来再复制给后半即可 1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 5 using namespace std; 6 7 typedef long long ll; 8 9 int T,a[26],st[26],cas=1,len; 10 ll

6 UVA 10252 Common Permutation

求两个字符串的最长公共串. 即统计各字符出现的次数,按字母序枚举,输出该字符两个字符串中出现的较少次数. #include<cstdio> #include<cstring> int cnt1[50],cnt2[50]; char s1[1010],s2[1010]; int main() { int i,j,len1,len2; while(gets(s1)!=NULL) { gets(s2); len1=strlen(s1); len2=strlen(s2); memset(c

UVA题目分类

题目 Volume 0. Getting Started 开始10055 - Hashmat the Brave Warrior 10071 - Back to High School Physics 10300 - Ecological Premium 458 - The Decoder 494 - Kindergarten Counting Game 414 - Machined Surfaces 490 - Rotating Sentences 445 - Marvelous Mazes

大白书

UVA 11292 (简单贪心) 题意: n条恶龙,m个勇士,用勇士来杀恶龙.一个勇士只能杀一个恶龙.而且勇士只能杀直径不超过自己能力值的恶龙.每个勇士需要支付能力值一样的金币.问杀掉所有恶龙需要的最少金币. 思路: 贪心,均从小到大排序.为每一条龙找一个恰好能杀他的骑士.简单贪心. UVA 11729 (经典贪心问题) 题意: n个任务,需要交代B分钟,执行J分钟,让你合理选择交代任务的次序,求得n个任务完成的最小总时长. 思路: 经典贪心,通过比较俩俩的关系,得到整个序列的贪心排序方法.这个

uva 507 Jill Rides Again (分治)

uva 507 Jill Rides Again Jill likes to ride her bicycle, but since the pretty city of Greenhills where she lives has grown, Jill often uses the excellent public bus system for part of her journey. She has a folding bicycle which she carries with her