csu1513

题意:点球大战~~~

题意:两队点球,分为a队跟b队,a队踢一次b队踢一次,两个队伍加起来一个踢十次,假如可以使比赛先结束,就是胜负已经确定了就没必要继续下面的踢球了。例如  当每个队伍踢球三次 比分是0-3,这时候就没必要继续踢下去了,因为还能踢两次球,a队伍已经不可能赢了。所以比分直接是0-3结束了这场比赛。

思路:dfs搜索枚举各种进球与不进球的状态 加上一个剪枝条件 当枚举的比分a大于或者b大于了输入统计那个比分那么这种状态直接不要

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
double a[10],b[10];
double ans;
int zx,zy;
void dfs(int x,int y,double ga,double gb,int nx,int ny)
{
    if(x>zx||y>zy) return ;
    if(nx==5&&ny==5)
    {
        if(x==zx&&y==zy)
        {
            ans+=ga*gb;
        }
        return ;
    }
    if(x<y)
    {
        if(y-x>5-nx)//当相差的比分大于剩下可踢球的次数,则不需要比了直接统计
        {
            if(x==zx&&y==zy)
            {
                ans+=ga*gb;

            }
            return ;
        }
    }
      if(x>y)
    {
        if(x-y>5-ny)
        {
            if(x==zx&&y==zy)
            {
                ans+=ga*gb;

            }
            return ;
        }
    }


            if(x+1>y)
            {
              if(x+1-y<=5-ny)
                    dfs(x+1,y+1,ga*a[nx+1],gb*b[ny+1],nx+1,ny+1);
              else//x踢一次进了大于b队剩下的踢球次数
              {
                 if(x+1==zx&&y==zy)
                 {
                     ans+=ga*a[nx+1]*gb;
                 }
              }
            }
            else
            {

                  dfs(x+1,y+1,ga*a[nx+1],gb*b[ny+1],nx+1,ny+1);
            }



         if(x+1>y)
            {
              if(x+1-y<=5-ny)
                    dfs(x+1,y,ga*a[nx+1],gb*(1-b[ny+1]),nx+1,ny+1);
            }
            else
            {
                 dfs(x+1,y,ga*a[nx+1],gb*(1-b[ny+1]),nx+1,ny+1);
            }


           if(x<y)
                {
                    if(y-x<=5-nx-1)
                        dfs(x,y+1,ga*(1-a[nx+1]),gb*b[ny+1],nx+1,ny+1);
                    else
                    {
                        if(x==zx&&y==zy)
                        {
                            ans+=ga*(1-a[nx+1])*gb;
                        }
                    }
                }
            else
            {
                 dfs(x,y+1,ga*(1-a[nx+1]),gb*b[ny+1],nx+1,ny+1);
            }


            if(x<y)
                    {  if(y-x<=5-nx-1)
                          dfs(x,y,ga*(1-a[nx+1]),gb*(1-b[ny+1]),nx+1,ny+1);

                    }
              else
              {
                   dfs(x,y,ga*(1-a[nx+1]),gb*(1-b[ny+1]),nx+1,ny+1);
              }



}
int main()
{   int xxx=1;
    while(scanf("%lf",&a[1])!=EOF)
    {   for(int i=2;i<=5;i++)
       {
          scanf("%lf ",&a[i]);
       }
       for(int i=1;i<=5;i++)
       {
          scanf("%lf ",&b[i]);
       }
        scanf("%d-%d",&zx,&zy);
        ans=0;
        dfs(0,0,1,1,0,0);//表示a队得分b队得分a队概率b队概率,a队踢球的次数,b队踢球的次数。
        printf("Case %d: %.2lf%%\n",xxx++,ans*100);
    }
}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值