zoukankan      html  css  js  c++  java
  • BestCoder Round #63 (div.2)

    感觉有些无聊的比赛。

    A

    暴力枚举下就行

    B

    简单的dp,但是wa了一发后就去先把C做了,然后发现如果输入的100个数,是如1,2,3,4,...,100,然后k=50,个数为c(100,50).果断大数。用了个c++的大数模板,感觉用的很爽。

    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    using namespace std;
    
    
    
    #define DIGIT   4      //四位隔开,即万进制
    #define DEPTH   10000        //万进制
    #define MAX     100    //题目最大位数/4,要不大直接设为最大位数也行
    typedef int bignum_t[MAX+1];
    
    /************************************************************************/
    /* 读取操作数,对操作数进行处理存储在数组里                             */
    /************************************************************************/
    int read(bignum_t a,istream&is=cin)
    {
        char buf[MAX*DIGIT+1],ch ;
        int i,j ;
        memset((void*)a,0,sizeof(bignum_t));
        if(!(is>>buf))return 0 ;
        for(a[0]=strlen(buf),i=a[0]/2-1;i>=0;i--)
            ch=buf[i],buf[i]=buf[a[0]-1-i],buf[a[0]-1-i]=ch ;
        for(a[0]=(a[0]+DIGIT-1)/DIGIT,j=strlen(buf);j<a[0]*DIGIT;buf[j++]='0');
        for(i=1;i<=a[0];i++)
            for(a[i]=0,j=0;j<DIGIT;j++)
                a[i]=a[i]*10+buf[i*DIGIT-1-j]-'0' ;
        for(;!a[a[0]]&&a[0]>1;a[0]--);
        return 1 ;
    }
    
    void write(const bignum_t a,ostream&os=cout)
    {
        int i,j ;
        for(os<<a[i=a[0]],i--;i;i--)
            for(j=DEPTH/10;j;j/=10)
                os<<a[i]/j%10 ;
    }
    
    int comp(const bignum_t a,const bignum_t b)
    {
        int i ;
        if(a[0]!=b[0])
            return a[0]-b[0];
        for(i=a[0];i;i--)
            if(a[i]!=b[i])
                return a[i]-b[i];
        return 0 ;
    }
    
    int comp(const bignum_t a,const int b)
    {
        int c[12]=
        {
        }
        ;
        for(c[1]=b;c[c[0]]>=DEPTH;c[c[0]+1]=c[c[0]]/DEPTH,c[c[0]]%=DEPTH,c[0]++);
        return comp(a,c);
    }
    
    int comp(const bignum_t a,const int c,const int d,const bignum_t b)
    {
        int i,t=0,O=-DEPTH*2 ;
        if(b[0]-a[0]<d&&c)
            return 1 ;
        for(i=b[0];i>d;i--)
        {
            t=t*DEPTH+a[i-d]*c-b[i];
            if(t>0)return 1 ;
            if(t<O)return 0 ;
        }
        for(i=d;i;i--)
        {
            t=t*DEPTH-b[i];
            if(t>0)return 1 ;
            if(t<O)return 0 ;
        }
        return t>0 ;
    }
    /************************************************************************/
    /* 大数与大数相加                                                       */
    /************************************************************************/
    void add(bignum_t a,const bignum_t b)
    {
        int i ;
        for(i=1;i<=b[0];i++)
            if((a[i]+=b[i])>=DEPTH)
                a[i]-=DEPTH,a[i+1]++;
        if(b[0]>=a[0])
            a[0]=b[0];
        else
            for(;a[i]>=DEPTH&&i<a[0];a[i]-=DEPTH,i++,a[i]++);
        a[0]+=(a[a[0]+1]>0);
    }
    /************************************************************************/
    /* 大数与小数相加                                                       */
    /************************************************************************/
    void add(bignum_t a,const int b)
    {
        int i=1 ;
        for(a[1]+=b;a[i]>=DEPTH&&i<a[0];a[i+1]+=a[i]/DEPTH,a[i]%=DEPTH,i++);
        for(;a[a[0]]>=DEPTH;a[a[0]+1]=a[a[0]]/DEPTH,a[a[0]]%=DEPTH,a[0]++);
    }
    /************************************************************************/
    /* 大数相减(被减数>=减数)                                               */
    /************************************************************************/
    void sub(bignum_t a,const bignum_t b)
    {
        int i ;
        for(i=1;i<=b[0];i++)
            if((a[i]-=b[i])<0)
                a[i+1]--,a[i]+=DEPTH ;
        for(;a[i]<0;a[i]+=DEPTH,i++,a[i]--);
        for(;!a[a[0]]&&a[0]>1;a[0]--);
    }
    /************************************************************************/
    /* 大数减去小数(被减数>=减数)                                           */
    /************************************************************************/
    void sub(bignum_t a,const int b)
    {
        int i=1 ;
        for(a[1]-=b;a[i]<0;a[i+1]+=(a[i]-DEPTH+1)/DEPTH,a[i]-=(a[i]-DEPTH+1)/DEPTH*DEPTH,i++);
        for(;!a[a[0]]&&a[0]>1;a[0]--);
    }
    
    void sub(bignum_t a,const bignum_t b,const int c,const int d)
    {
        int i,O=b[0]+d ;
        for(i=1+d;i<=O;i++)
            if((a[i]-=b[i-d]*c)<0)
                a[i+1]+=(a[i]-DEPTH+1)/DEPTH,a[i]-=(a[i]-DEPTH+1)/DEPTH*DEPTH ;
        for(;a[i]<0;a[i+1]+=(a[i]-DEPTH+1)/DEPTH,a[i]-=(a[i]-DEPTH+1)/DEPTH*DEPTH,i++);
        for(;!a[a[0]]&&a[0]>1;a[0]--);
    }
    /************************************************************************/
    /* 大数相乘,读入被乘数a,乘数b,结果保存在c[]                          */
    /************************************************************************/
    void mul(bignum_t c,const bignum_t a,const bignum_t b)
    {
        int i,j ;
        memset((void*)c,0,sizeof(bignum_t));
        for(c[0]=a[0]+b[0]-1,i=1;i<=a[0];i++)
            for(j=1;j<=b[0];j++)
                if((c[i+j-1]+=a[i]*b[j])>=DEPTH)
                    c[i+j]+=c[i+j-1]/DEPTH,c[i+j-1]%=DEPTH ;
        for(c[0]+=(c[c[0]+1]>0);!c[c[0]]&&c[0]>1;c[0]--);
    }
    /************************************************************************/
    /* 大数乘以小数,读入被乘数a,乘数b,结果保存在被乘数                   */
    /************************************************************************/
    void mul(bignum_t a,const int b)
    {
        int i ;
        for(a[1]*=b,i=2;i<=a[0];i++)
        {
            a[i]*=b ;
            if(a[i-1]>=DEPTH)
                a[i]+=a[i-1]/DEPTH,a[i-1]%=DEPTH ;
        }
        for(;a[a[0]]>=DEPTH;a[a[0]+1]=a[a[0]]/DEPTH,a[a[0]]%=DEPTH,a[0]++);
        for(;!a[a[0]]&&a[0]>1;a[0]--);
    }
    
    void mul(bignum_t b,const bignum_t a,const int c,const int d)
    {
        int i ;
        memset((void*)b,0,sizeof(bignum_t));
        for(b[0]=a[0]+d,i=d+1;i<=b[0];i++)
            if((b[i]+=a[i-d]*c)>=DEPTH)
                b[i+1]+=b[i]/DEPTH,b[i]%=DEPTH ;
        for(;b[b[0]+1];b[0]++,b[b[0]+1]=b[b[0]]/DEPTH,b[b[0]]%=DEPTH);
        for(;!b[b[0]]&&b[0]>1;b[0]--);
    }
    /**************************************************************************/
    /* 大数相除,读入被除数a,除数b,结果保存在c[]数组                         */
    /* 需要comp()函数                                                         */
    /**************************************************************************/
    void div(bignum_t c,bignum_t a,const bignum_t b)
    {
        int h,l,m,i ;
        memset((void*)c,0,sizeof(bignum_t));
        c[0]=(b[0]<a[0]+1)?(a[0]-b[0]+2):1 ;
        for(i=c[0];i;sub(a,b,c[i]=m,i-1),i--)
            for(h=DEPTH-1,l=0,m=(h+l+1)>>1;h>l;m=(h+l+1)>>1)
                if(comp(b,m,i-1,a))h=m-1 ;
                else l=m ;
        for(;!c[c[0]]&&c[0]>1;c[0]--);
        c[0]=c[0]>1?c[0]:1 ;
    }
    
    void div(bignum_t a,const int b,int&c)
    {
        int i ;
        for(c=0,i=a[0];i;c=c*DEPTH+a[i],a[i]=c/b,c%=b,i--);
        for(;!a[a[0]]&&a[0]>1;a[0]--);
    }
    /************************************************************************/
    /* 大数平方根,读入大数a,结果保存在b[]数组里                           */
    /* 需要comp()函数                                                       */
    /************************************************************************/
    void sqrt(bignum_t b,bignum_t a)
    {
        int h,l,m,i ;
        memset((void*)b,0,sizeof(bignum_t));
        for(i=b[0]=(a[0]+1)>>1;i;sub(a,b,m,i-1),b[i]+=m,i--)
            for(h=DEPTH-1,l=0,b[i]=m=(h+l+1)>>1;h>l;b[i]=m=(h+l+1)>>1)
                if(comp(b,m,i-1,a))h=m-1 ;
                else l=m ;
        for(;!b[b[0]]&&b[0]>1;b[0]--);
        for(i=1;i<=b[0];b[i++]>>=1);
    }
    /************************************************************************/
    /* 返回大数的长度                                                       */
    /************************************************************************/
    int length(const bignum_t a)
    {
        int t,ret ;
        for(ret=(a[0]-1)*DIGIT,t=a[a[0]];t;t/=10,ret++);
        return ret>0?ret:1 ;
    }
    /************************************************************************/
    /* 返回指定位置的数字,从低位开始数到第b位,返回b位上的数               */
    /************************************************************************/
    int digit(const bignum_t a,const int b)
    {
        int i,ret ;
        for(ret=a[(b-1)/DIGIT+1],i=(b-1)%DIGIT;i;ret/=10,i--);
        return ret%10 ;
    }
    /************************************************************************/
    /* 返回大数末尾0的个数                                                  */
    /************************************************************************/
    int zeronum(const bignum_t a)
    {
        int ret,t ;
        for(ret=0;!a[ret+1];ret++);
        for(t=a[ret+1],ret*=DIGIT;!(t%10);t/=10,ret++);
        return ret ;
    }
    
    void comp(int*a,const int l,const int h,const int d)
    {
        int i,j,t ;
        for(i=l;i<=h;i++)
            for(t=i,j=2;t>1;j++)
                while(!(t%j))
                    a[j]+=d,t/=j ;
    }
    
    void convert(int*a,const int h,bignum_t b)
    {
        int i,j,t=1 ;
        memset(b,0,sizeof(bignum_t));
        for(b[0]=b[1]=1,i=2;i<=h;i++)
            if(a[i])
                for(j=a[i];j;t*=i,j--)
                    if(t*i>DEPTH)
                        mul(b,t),t=1 ;
        mul(b,t);
    }
    /************************************************************************/
    /* 组合数                                                               */
    /************************************************************************/
    void combination(bignum_t a,int m,int n)
    {
        int*t=new int[m+1];
        memset((void*)t,0,sizeof(int)*(m+1));
        comp(t,n+1,m,1);
        comp(t,2,m-n,-1);
        convert(t,m,a);
        delete[]t ;
    }
    /************************************************************************/
    /* 排列数                                                               */
    /************************************************************************/
    void permutation(bignum_t a,int m,int n)
    {
        int i,t=1 ;
        memset(a,0,sizeof(bignum_t));
        a[0]=a[1]=1 ;
        for(i=m-n+1;i<=m;t*=i++)
            if(t*i>DEPTH)
                mul(a,t),t=1 ;
        mul(a,t);
    }
    
    #define SGN(x) ((x)>0?1:((x)<0?-1:0))
    #define ABS(x) ((x)>0?(x):-(x))
    
    int read(bignum_t a,int&sgn,istream&is=cin)
    {
        char str[MAX*DIGIT+2],ch,*buf ;
        int i,j ;
        memset((void*)a,0,sizeof(bignum_t));
        if(!(is>>str))return 0 ;
        buf=str,sgn=1 ;
        if(*buf=='-')sgn=-1,buf++;
        for(a[0]=strlen(buf),i=a[0]/2-1;i>=0;i--)
            ch=buf[i],buf[i]=buf[a[0]-1-i],buf[a[0]-1-i]=ch ;
        for(a[0]=(a[0]+DIGIT-1)/DIGIT,j=strlen(buf);j<a[0]*DIGIT;buf[j++]='0');
        for(i=1;i<=a[0];i++)
            for(a[i]=0,j=0;j<DIGIT;j++)
                a[i]=a[i]*10+buf[i*DIGIT-1-j]-'0' ;
        for(;!a[a[0]]&&a[0]>1;a[0]--);
        if(a[0]==1&&!a[1])sgn=0 ;
        return 1 ;
    }
    struct bignum
    {
        bignum_t num ;
        int sgn ;
        public :
        inline bignum()
        {
            memset(num,0,sizeof(bignum_t));
            num[0]=1 ;
            sgn=0 ;
        }
        inline int operator!()
        {
            return num[0]==1&&!num[1];
        }
        inline bignum&operator=(const bignum&a)
        {
            memcpy(num,a.num,sizeof(bignum_t));
            sgn=a.sgn ;
            return*this ;
        }
        inline bignum&operator=(const int a)
        {
            memset(num,0,sizeof(bignum_t));
            num[0]=1 ;
            sgn=SGN (a);
            add(num,sgn*a);
            return*this ;
        }
        ;
        inline bignum&operator+=(const bignum&a)
        {
            if(sgn==a.sgn)add(num,a.num);
            else if
                (sgn&&a.sgn)
            {
                int ret=comp(num,a.num);
                if(ret>0)sub(num,a.num);
                else if(ret<0)
                {
                    bignum_t t ;
                    memcpy(t,num,sizeof(bignum_t));
                    memcpy(num,a.num,sizeof(bignum_t));
                    sub (num,t);
                    sgn=a.sgn ;
                }
                else memset(num,0,sizeof(bignum_t)),num[0]=1,sgn=0 ;
            }
            else if(!sgn)
                memcpy(num,a.num,sizeof(bignum_t)),sgn=a.sgn ;
            return*this ;
        }
        inline bignum&operator+=(const int a)
        {
            if(sgn*a>0)add(num,ABS(a));
            else if(sgn&&a)
            {
                int  ret=comp(num,ABS(a));
                if(ret>0)sub(num,ABS(a));
                else if(ret<0)
                {
                    bignum_t t ;
                    memcpy(t,num,sizeof(bignum_t));
                    memset(num,0,sizeof(bignum_t));
                    num[0]=1 ;
                    add(num,ABS (a));
                    sgn=-sgn ;
                    sub(num,t);
                }
                else memset(num,0,sizeof(bignum_t)),num[0]=1,sgn=0 ;
            }
            else if
                (!sgn)sgn=SGN(a),add(num,ABS(a));
            return*this ;
        }
        inline bignum operator+(const bignum&a)
        {
            bignum ret ;
            memcpy(ret.num,num,sizeof (bignum_t));
            ret.sgn=sgn ;
            ret+=a ;
            return ret ;
        }
        inline bignum operator+(const int a)
        {
            bignum ret ;
            memcpy(ret.num,num,sizeof (bignum_t));
            ret.sgn=sgn ;
            ret+=a ;
            return ret ;
        }
        inline bignum&operator-=(const bignum&a)
        {
            if(sgn*a.sgn<0)add(num,a.num);
            else if
                (sgn&&a.sgn)
            {
                int ret=comp(num,a.num);
                if(ret>0)sub(num,a.num);
                else if(ret<0)
                {
                    bignum_t t ;
                    memcpy(t,num,sizeof(bignum_t));
                    memcpy(num,a.num,sizeof(bignum_t));
                    sub(num,t);
                    sgn=-sgn ;
                }
                else memset(num,0,sizeof(bignum_t)),num[0]=1,sgn=0 ;
            }
            else if(!sgn)add (num,a.num),sgn=-a.sgn ;
            return*this ;
        }
        inline bignum&operator-=(const int a)
        {
            if(sgn*a<0)add(num,ABS(a));
            else if(sgn&&a)
            {
                int  ret=comp(num,ABS(a));
                if(ret>0)sub(num,ABS(a));
                else if(ret<0)
                {
                    bignum_t t ;
                    memcpy(t,num,sizeof(bignum_t));
                    memset(num,0,sizeof(bignum_t));
                    num[0]=1 ;
                    add(num,ABS(a));
                    sub(num,t);
                    sgn=-sgn ;
                }
                else memset(num,0,sizeof(bignum_t)),num[0]=1,sgn=0 ;
            }
            else if
                (!sgn)sgn=-SGN(a),add(num,ABS(a));
            return*this ;
        }
        inline bignum operator-(const bignum&a)
        {
            bignum ret ;
            memcpy(ret.num,num,sizeof(bignum_t));
            ret.sgn=sgn ;
            ret-=a ;
            return ret ;
        }
        inline bignum operator-(const int a)
        {
            bignum ret ;
            memcpy(ret.num,num,sizeof(bignum_t));
            ret.sgn=sgn ;
            ret-=a ;
            return ret ;
        }
        inline bignum&operator*=(const bignum&a)
        {
            bignum_t t ;
            mul(t,num,a.num);
            memcpy(num,t,sizeof(bignum_t));
            sgn*=a.sgn ;
            return*this ;
        }
        inline bignum&operator*=(const int a)
        {
            mul(num,ABS(a));
            sgn*=SGN(a);
            return*this ;
        }
        inline bignum operator*(const bignum&a)
        {
            bignum ret ;
            mul(ret.num,num,a.num);
            ret.sgn=sgn*a.sgn ;
            return ret ;
        }
        inline bignum operator*(const int a)
        {
            bignum ret ;
            memcpy(ret.num,num,sizeof (bignum_t));
            mul(ret.num,ABS(a));
            ret.sgn=sgn*SGN(a);
            return ret ;
        }
        inline bignum&operator/=(const bignum&a)
        {
            bignum_t t ;
            div(t,num,a.num);
            memcpy (num,t,sizeof(bignum_t));
            sgn=(num[0]==1&&!num[1])?0:sgn*a.sgn ;
            return*this ;
        }
        inline bignum&operator/=(const int a)
        {
            int t ;
            div(num,ABS(a),t);
            sgn=(num[0]==1&&!num [1])?0:sgn*SGN(a);
            return*this ;
        }
        inline bignum operator/(const bignum&a)
        {
            bignum ret ;
            bignum_t t ;
            memcpy(t,num,sizeof(bignum_t));
            div(ret.num,t,a.num);
            ret.sgn=(ret.num[0]==1&&!ret.num[1])?0:sgn*a.sgn ;
            return ret ;
        }
        inline bignum operator/(const int a)
        {
            bignum ret ;
            int t ;
            memcpy(ret.num,num,sizeof(bignum_t));
            div(ret.num,ABS(a),t);
            ret.sgn=(ret.num[0]==1&&!ret.num[1])?0:sgn*SGN(a);
            return ret ;
        }
        inline bignum&operator%=(const bignum&a)
        {
            bignum_t t ;
            div(t,num,a.num);
            if(num[0]==1&&!num[1])sgn=0 ;
            return*this ;
        }
        inline int operator%=(const int a)
        {
            int t ;
            div(num,ABS(a),t);
            memset(num,0,sizeof (bignum_t));
            num[0]=1 ;
            add(num,t);
            return t ;
        }
        inline bignum operator%(const bignum&a)
        {
            bignum ret ;
            bignum_t t ;
            memcpy(ret.num,num,sizeof(bignum_t));
            div(t,ret.num,a.num);
            ret.sgn=(ret.num[0]==1&&!ret.num [1])?0:sgn ;
            return ret ;
        }
        inline int operator%(const int a)
        {
            bignum ret ;
            int t ;
            memcpy(ret.num,num,sizeof(bignum_t));
            div(ret.num,ABS(a),t);
            memset(ret.num,0,sizeof(bignum_t));
            ret.num[0]=1 ;
            add(ret.num,t);
            return t ;
        }
        inline bignum&operator++()
        {
            *this+=1 ;
            return*this ;
        }
        inline bignum&operator--()
        {
            *this-=1 ;
            return*this ;
        }
        ;
        inline int operator>(const bignum&a)
        {
            return sgn>0?(a.sgn>0?comp(num,a.num)>0:1):(sgn<0?(a.sgn<0?comp(num,a.num)<0:0):a.sgn<0);
        }
        inline int operator>(const int a)
        {
            return sgn>0?(a>0?comp(num,a)>0:1):(sgn<0?(a<0?comp(num,-a)<0:0):a<0);
        }
        inline int operator>=(const bignum&a)
        {
            return sgn>0?(a.sgn>0?comp(num,a.num)>=0:1):(sgn<0?(a.sgn<0?comp(num,a.num)<=0:0):a.sgn<=0);
        }
        inline int operator>=(const int a)
        {
            return sgn>0?(a>0?comp(num,a)>=0:1):(sgn<0?(a<0?comp(num,-a)<=0:0):a<=0);
        }
        inline int operator<(const bignum&a)
        {
            return sgn<0?(a.sgn<0?comp(num,a.num)>0:1):(sgn>0?(a.sgn>0?comp(num,a.num)<0:0):a.sgn>0);
        }
        inline int operator<(const int a)
        {
            return sgn<0?(a<0?comp(num,-a)>0:1):(sgn>0?(a>0?comp(num,a)<0:0):a>0);
        }
        inline int operator<=(const bignum&a)
        {
            return sgn<0?(a.sgn<0?comp(num,a.num)>=0:1):(sgn>0?(a.sgn>0?comp(num,a.num)<=0:0):a.sgn>=0);
        }
        inline int operator<=(const int a)
        {
            return sgn<0?(a<0?comp(num,-a)>=0:1):
            (sgn>0?(a>0?comp(num,a)<=0:0):a>=0);
        }
        inline int operator==(const bignum&a)
        {
            return(sgn==a.sgn)?!comp(num,a.num):0 ;
        }
        inline int operator==(const int a)
        {
            return(sgn*a>=0)?!comp(num,ABS(a)):0 ;
        }
        inline int operator!=(const bignum&a)
        {
            return(sgn==a.sgn)?comp(num,a.num):1 ;
        }
        inline int operator!=(const int a)
        {
            return(sgn*a>=0)?comp(num,ABS(a)):1 ;
        }
        inline int operator[](const int a)
        {
            return digit(num,a);
        }
        friend inline istream&operator>>(istream&is,bignum&a)
        {
            read(a.num,a.sgn,is);
            return  is ;
        }
        friend inline ostream&operator<<(ostream&os,const bignum&a)
        {
            if(a.sgn<0)
                os<<'-' ;
            write(a.num,os);
            return os ;
        }
        friend inline bignum sqrt(const bignum&a)
        {
            bignum ret ;
            bignum_t t ;
            memcpy(t,a.num,sizeof(bignum_t));
            sqrt(ret.num,t);
            ret.sgn=ret.num[0]!=1||ret.num[1];
            return ret ;
        }
        friend inline bignum sqrt(const bignum&a,bignum&b)
        {
            bignum ret ;
            memcpy(b.num,a.num,sizeof(bignum_t));
            sqrt(ret.num,b.num);
            ret.sgn=ret.num[0]!=1||ret.num[1];
            b.sgn=b.num[0]!=1||ret.num[1];
            return ret ;
        }
        inline int length()
        {
            return :: length(num);
        }
        inline int zeronum()
        {
            return :: zeronum(num);
        }
        inline bignum C(const int m,const int n)
        {
            combination(num,m,n);
            sgn=1 ;
            return*this ;
        }
        inline bignum P(const int m,const int n)
        {
            permutation(num,m,n);
            sgn=1 ;
            return*this ;
        }
    };
    
    /*
    int main()
    {
        bignum a,b,c;
        cin>>a>>b;
        cout<<"加法:"<<a+b<<endl;
        cout<<"减法:"<<a-b<<endl;
        cout<<"乘法:"<<a*b<<endl;
        cout<<"除法:"<<a/b<<endl;
        c=sqrt(a);
        cout<<"平方根:"<<c<<endl;
        cout<<"a的长度:"<<a.length()<<endl;
        cout<<"a的末尾0个数:"<<a.zeronum()<<endl<<endl;
        cout<<"组合: 从10个不同元素取3个元素组合的所有可能性为"<<c.C(10,3)<<endl;
        cout<<"排列: 从10个不同元素取3个元素排列的所有可能性为"<<c.P(10,3)<<endl;
        return 0 ;
    }
    */
    int g[1010];
    bignum dp[110][110];
    
    int main()
    {
        int n,k;
        while(cin>>n>>k)
        {
            memset(dp,0,sizeof(dp));
            for(int i=1;i<=n;i++)
                scanf("%d",g+i);
            for(int i=1;i<=n;i++)
                dp[i][1]=1;
            for(int i=2;i<=n;i++)
            {
                for(int j=2;j<=k;j++)
                {
                    for(int p=1;p<i;p++)
                    {
                        if(g[p] < g[i])
                        {
                            dp[i][j] += dp[p][j-1];
                        }
                    }
                }
            }
            bignum sum;
            sum=0;
            for(int i=1;i<=n;i++)
                sum += dp[i][k];
            cout<<sum<<endl;
        }
        return 0;
    }
    View Code

    C

    也是一个简单的dp.

    dp[i][j]表示当前走到第i,j个位置的最小贡献,我们可以假定(i+j)为奇数,由该状态可以转移向最多4个位置,就可以了。

    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    using namespace std;
    #define INF 1000000000
    
    int dp[1010][1010];
    
    int g[1010][1010];
    
    int main()
    {
        int n,m;
        while(cin>>n>>m)
        {
            for(int i=1;i<=n;i++)
                for(int j=1;j<=m;j++)
                    scanf("%d",&g[i][j]);
            for(int i=1;i<=n;i++)
                for(int j=1;j<=m;j++)
                    dp[i][j]=INF;
            dp[1][1]=0;
            for(int i=1;i<=n;i++)
            {
                for(int j=1-(i%2)+1;j<=m;j+=2)
                {
                    if(i+2<=n) dp[i+2][j]=min(dp[i+2][j],dp[i][j]+g[i][j]*g[i+1][j]);
                    if(j+2<=m) dp[i][j+2]=min(dp[i][j+2],dp[i][j]+g[i][j]*g[i][j+1]);
                    if(i+1<=n&&j+1<=m) dp[i+1][j+1]=min( dp[i+1][j+1],dp[i][j]+min(g[i][j]*g[i+1][j],g[i][j]*g[i][j+1]) );
                }
            }
            int ans=INF;
            if(n!=1) ans=min(ans,dp[n-1][m]+g[n-1][m]*g[n][m]);
            if(m!=1) ans=min(ans,dp[n][m-1]+g[n][m-1]*g[n][m]);
            cout<<ans<<endl;
        }
        return 0;
    }

    d.比赛的时候没有想出来。 就是个概率题,当年考研的时候概率果真还是没有复习好。

    我们先假设有n个独立事件,a1,a2,a3,...,an。对应发生的概率为p1,p2,p3,...,pn

    则最后有多少个事件发生的期望为 x = p1+p2+p3+...+pn

    而最后有多少个事件数平方的期望为  x^2=(p1+p2+p3+...pn)^2 + [(p1-p1^2)+(p2-p2^2)+(p3-p3^2)+...+(p3-p3^2)]  (其实就是任意两个事件同时发生的概率和)

    为什么呢? 我是举了几个例子用归纳法证明的。

    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <algorithm>
    using namespace std;
    
    int g[1010][1010];
    double p[1010][1010];
    
    int main()
    {
        int n,m;
        while(cin>>n>>m)
        {
            for(int i=1;i<=n;i++)
                for(int j=1;j<=m;j++)
                    scanf("%d",&g[i][j]);
            for(int i=1;i<=n;i++)
            {
                double sum=0;
                for(int j=1;j<=m;j++)
                {
                    sum += g[i][j];
                }
                for(int j=1;j<=m;j++)
                {
                    p[i][j] = (double)g[i][j]/sum;
                }
            }
            double ans=0;
            for(int j=1;j<=m;j++)
            {
                double sum=0;
                double tmp1=0;
                for(int i=1;i<=n;i++)
                {
                    sum += p[i][j];
                    tmp1 += p[i][j]-p[i][j]*p[i][j];
                }
                ans += sum*sum+tmp1;
            }
            printf("%.2lf
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    微信小程序TodoList
    C语言88案例-找出数列中的最大值和最小值
    C语言88案例-使用指针的指针输出字符串
  • 原文地址:https://www.cnblogs.com/chenhuan001/p/4986622.html
Copyright © 2011-2022 走看看