Codeforces Beta Round #95 (Div. 2) 部分解题报告 (dp,组合数,)

做这样的比赛既考快速编码的能力,还有快速思维的能力。本人很弱,跌了rating。。加油!!!。。

 

第一题上来就把题意理解错了。。粗心啊。。直接模拟着做就行:1:如果字符串全是大写字母就进行大小写转换:2:如果除了第一个是小写字母其他都是大写字母就进行大小写转换:其他 原样输出。。

ct记录大写字母的个数。。

if(ct==len||(ct==len-1&&(str[0]>='a'&&str[0]<='z')))

  第二题:我直接就是二了。题目中说的是-10---10结果我二处理成-9--9了。。悲剧啊。。。

记录每个数出现的个数:注意负数的处理,我是用一个结构体处理了。。

#include <iostream>

#include <cstdio>

#include <cstring>

using namespace std;

int const max_s = 107;

struct node

{

    __int64 flen,zlen;

}p[max_s];

int main()

{

    __int64 ans;

    int i,b,n;

    while(scanf("%d",&n)!=EOF)

    {

        memset(p,0,sizeof(p));

        ans=0;

        for(i=0;i<n;i++)

        {

            scanf("%d",&b);



            if(b>=0)

            p[b].zlen++;

            else

            p[-b].flen++;



        }

        //for(i=0;i<=9;i++)

        //printf("%d %d %d\n",i,p[i].zlen,p[i].flen);

        for(i=0;i<=10;i++)

        {

            if(p[i].zlen!=0)

            {

                if(i==0)

                {

                    ans+=(p[i].zlen*(p[i].zlen-1))/2;//0的时候是c(n,2);

                }

                else

                {

                    ans+=(p[i].zlen*p[i].flen);//不是0就是负数的个数*正数的个数

                }

            }

        }

        printf("%I64d\n",ans);

    }

    return 0;

}

  第三题:才开始我用暴力做,结果Wa,最后听他们说是dp求组合数。。。我晕了, 哎自己的dp太弱了。然后暴力求姐

#include <iostream>

#include <cstdio>

using namespace std;

const int max_s = 35;

long long dp[max_s][max_s];

int n,m,t;

void init()//dp求解组合数(打表)

{

    int i,j;

   for(i=1;i<=30;i++)

   {

       dp[i][i]=1;

       dp[i][1]=i;

   }

   for(i=2;i<=30;i++)

   {

       for(j=2;j<=30;j++)

       {

           if(j>i)

           break;

           dp[i][j]=dp[i-1][j-1]+dp[i-1][j];

       }

   }

   /*for(i=1;i<=10;i++)

   {

       for(j=1;j<=10;j++)

       cout<<dp[i][j]<<" ";

       cout<<endl;

   }*/



}

int main()

{

    int i;

    init();

    long long ans;

    while(~scanf("%d%d%d",&n,&m,&t))

    {

        ans=0;

        for(i=4;i<=n;i++)

        {

            if(t-i>=1&&t-i<=m)

            ans+=dp[n][i]*dp[m][t-i];//主要公式。

        }

        cout<<ans<<endl;

    }

    return 0;

}

  

你可能感兴趣的:(codeforces)