zoukankan      html  css  js  c++  java
  • 算法训练 摆动序列

    问题描述
      如果一个序列满足下面的性质,我们就将它称为摆动序列:
      1. 序列中的所有数都是不大于k的正整数;
      2. 序列中至少有两个数。
      3. 序列中的数两两不相等;
      4. 如果第i – 1个数比第i – 2个数大,则第i个数比第i – 2个数小;如果第i – 1个数比第i – 2个数小,则第i个数比第i – 2个数大。
      比如,当k = 3时,有下面几个这样的序列:
      1 2
      1 3
      2 1
      2 1 3
      2 3
      2 3 1
      3 1
      3 2
      一共有8种,给定k,请求出满足上面要求的序列的个数。
    输入格式
      输入包含了一个整数k。(k<=20)
    输出格式
      输出一个整数,表示满足要求的序列个数。
    样例输入
    3
    样例输出
    8
    思路:从C(K,i)中取出来的数需要满足条件4),那么只可能有两种排列(只要第一个数和第二个数的大小确定,排列必然唯一)
    本质上是计算2(C(K,2)+C(K,3)....+C(K,K)),
    #include <stdio.h>
    #define ll long long
    int fac(short i)//最大10!=3628800
    {
        short t = 1;
        int s = 1;
        for(;t <= i;t++)
            s *= t;
        return s;
    }
    ll combinate(short i,short k)//求组合数C(k,i)
    {
        short t;
        ll s = 1;
        if(i > k/2)
            i = k - i;
        for(t=0;t<i;t++)
            s *= (k-t);
        return s/fac(i);
    }
    int main()
    {
        short k,i;
        ll s = 0;
        scanf("%hd",&k);
        for(i=2;i<=k;i++)
            s += combinate(i,k);
        printf("%d
    ",2*s);
        return 0;
    }
  • 相关阅读:
    大臣的旅费 Apare_xzc 求树的直径 蓝桥杯
    连号区间数 Apare_xzc
    js盒模型
    js仿真进度条
    JS卷动事件
    json对象读取
    button属性及兼容性处理
    js图片跟随效果
    商城倒计时JS怎么做
    计算某天距离现在日期的差值
  • 原文地址:https://www.cnblogs.com/emptyCoder/p/5144825.html
Copyright © 2011-2022 走看看