题意:
点球大战 双方各有五名队员
一队一人交替点球
如果中途已经决出胜负了 那就不用继续了
问最后踢成x-y这种比分的可能性
思路:
直接搜索 注意跳出条件
训练时没有A出来就是因为跳出条件
aa bb是A B两队当前主罚队员
如果到了5 就意味着这一队已经结束了点球
一开始写成了到4结束 就相当于最后一个人没有踢……
1 #include<bits/stdc++.h> 2 #define cl(a,b) memset(a,b,sizeof(a)) 3 #define debug(x) cerr<<#x<<"=="<<(x)<<endl 4 using namespace std; 5 6 int x,y; 7 double a[5],b[5],ans; 8 9 10 // A:B 当前比分 11 // turn 哪一方踢 12 // aa bb 当前双方主罚队员 13 // res 当前状态概率 14 15 void dfs(int A,int B,bool turn,int aa,int bb,double res) 16 { 17 //到4代表是最后一个人罚球 到5才是结束了 超过5都是多搜的 18 if(aa>5||bb>5) return ; 19 if(5-aa+A<B||5-bb+B<A) 20 {//一方必胜 结束点球大战 21 if(A==x&&B==y) 22 { 23 ans+=res; 24 } 25 return ; 26 } 27 if(A==x&&B==y&&aa==5&&bb==5) 28 {//已经达成目标分数并且双方球员点球结束 29 ans+=res; 30 return ; 31 } 32 if(turn) 33 {//A队主罚点球 34 //进了 35 dfs(A+1,B,!turn,aa+1,bb,res*a[aa]); 36 //没进 37 dfs(A+0,B,!turn,aa+1,bb,res*(1.0-a[aa])); 38 } 39 else 40 {//B队主罚点球 41 //进了 42 dfs(A,B+1,!turn,aa,bb+1,res*b[bb]); 43 //没进 44 dfs(A,B+0,!turn,aa,bb+1,res*(1.0-b[bb])); 45 } 46 } 47 48 int main() 49 { 50 int cas=1; 51 // freopen("in.txt","r",stdin); 52 while(~scanf("%lf",&a[0])) 53 { 54 for(int i=1;i<5;i++) 55 { 56 scanf("%lf",&a[i]); 57 } 58 for(int i=0;i<5;i++) 59 { 60 scanf("%lf",&b[i]); 61 } 62 ans=0.0; 63 scanf("%d-%d",&x,&y); 64 dfs(0,0,true,0,0,1.0); 65 printf("Case %d: %.2f%% ",cas++,ans*100); 66 } 67 return 0; 68 }/* 69 70 0.4 0.7 0.7 0.6 0.5 0.8 0.9 0.7 0.2 0.8 71 1-3 72 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 73 2-0 74 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 75 2-0 76 0.4 0.7 0.7 0.6 0.5 0.8 0.9 0.7 0.2 0.8 77 5-5 78 0.4 0.7 0.7 0.6 0.5 0.8 0.9 0.7 0.2 0.8 79 4-2 80 81 */