csu1513

来源:互联网 发布:云计算教育 编辑:程序博客网 时间:2024/05/29 04:25

题意:点球大战~~~

题意:两队点球,分为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);    }}



原创粉丝点击