zoukankan      html  css  js  c++  java
  • 算法竞赛训练指南2.1 计数方法

    1.  O(n)方法求C(n,m)

        利用公式C(n,k+1)=C(n,k)*(n-k)/(k+1)

        模板:

    #include <iostream>
    #include <algorithm>
    using namespace std;
    typedef unsigned long long LL;
    const int maxn=100005;
    LL n,m;
    LL C()
    {
        if(m==0||n==m)
            return 1;
        if(m>n-m)
            m=n-m;
        LL ans,temp=1;
        for(LL i=1;i<=m;i++)
        {
            ans=temp*(n-i+1)/i;
            temp=ans;
        }
        return ans;
    }
    int main()
    {
        ios::sync_with_stdio(false);
        int T;
        cin>>T;
        while(T--)
        {
            cin>>n>>m;
            cout<<C()<<endl;
        }
        return 0;
    }

    2.  有重复元素的全排列,有k个元素,其中第i个元素有ni个,求全排列的个数

        见白书的细致讲解,书上面说的更清楚。

    3.  可重复的选取的组合,有n个不同的元素,每个元素可以选多次,一共选k个元素,有多少种方法。

        想法:设第i个元素选xi个,问题就转化为了x1+x2+x3+...+xn=k的非负整数解有多少个,就相当于把k个元素分为n组,那么只需要再这些元素中插入n-1个板,然后再n-1+k当中找这n-1块板,那么结果就是C(n+k-1,n-1)=C(n-1+k,k);

    4.  单色三角形:给定n个点,且没有三色共线,每两个点之间都用黑色或者红色的线段连接,求3条边同色的三角形数。

        想法:求同色的可以先求不同色的,每个非单色的三角形中,恰好有两个顶点连接两条异色边,而且有一个公共点的两条异色边总是唯一对应一个非单色三角形,因此如果第i个点连接了ai条红边,n-1-ai条黑边,则这些边属于ai*(n-1-ai)个非单色的三角形,每个非单色的三角形选了两次故还需要除以2,这样同色的也就求出来了。

        

  • 相关阅读:
    7月的尾巴,你是XXX
    戏说Android view 工作流程《下》
    “燕子”
    Android开机动画bootanimation.zip
    戏说Android view 工作流程《上》
    ViewController里已连接的IBOutlet为什么会是nil
    My first App "Encrypt Wheel" is Ready to Download!
    iOS开发中角色Role所产生的悲剧(未完)
    UIScrollView实现不全屏分页的小技巧
    Apple misunderstood my app,now my app status changed to “In Review”
  • 原文地址:https://www.cnblogs.com/jkzr/p/9621278.html
Copyright © 2011-2022 走看看