HDUOJ----4504 威威貓系列故事——籃球夢
威威貓系列故事——籃球夢
Time Limit: 300/100 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 2786 Accepted Submission(s): 710
Problem Description
威威貓十分迷戀籃球比賽,是忠實的NBA球迷,他常常幻想自己那肥碩的身軀也能飛起扣籃。另外,他對籃球教練工作也情有獨鍾,特別是對比賽的戰術,投籃選擇方面也是很有研究,下面就是威威貓研究過的一個問題: 一場NBA籃球比賽總共48分鐘,假如我們現在已經知道當前比分 A:B,A代表我方的比分,B代表對方的比分,現在比賽還剩下t秒時間。我們簡單的認為雙方各自進攻一次的時間皆固定為15秒(不到15秒則進攻不得分),且為交替進攻,即我方進攻一次,接著對方進攻,依次迴圈。 進攻有三種選擇方式:(這裡不考慮命中率) 1、造犯規,(假設都兩罰一中)得1分; 2、中距離投籃 得2分; 3、三分球 得3分。 為了簡化問題,假設在對方回合,由於我方防守比較好,只讓對手得1分,且為固定,即對方的進攻回合就為每回合得1分。現在比賽進入最後關頭,接下來第一個回合是我方進攻,現在威威貓想要知道教練有多少種不同的選擇能使我方可能贏得比賽(可能的意思就是不考慮命中率的情況)。
Input
輸入有多組資料(不超過250組); 每組資料包含3個整數A,B和t,其中A和B 表示當前的比分(0 <= A, B <= 200),t表示還剩多少時間(單位秒 0 <= t <= 600)。
Output
請輸出可行的方案數,每組資料輸出佔一行。
Sample Input
88 90 50
Sample Output
6
Hint
樣例解析:當前比分是88:90,還剩50秒則對方還最多有一次進攻機會(最後5秒進攻不成功),我方有兩次,對方的最終得分將是91,我方至少在兩回閤中拿到4分才能勝利,所以所有方案數是6種,即: 第一球 第二球 1 3 2 2 2 3 3 1 3 2 3 3
Source
屬於組合數學,採用母函式,AC, 15ms
程式碼:
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 #define maxn 205 5 __int64 cc1[maxn],cc2[maxn] ; 6 int main() 7 { 8 int aa,bb,tt,nb,i,j,na,k; 9 while(scanf("%d%d%d",&aa,&bb,&tt)!=EOF) 10 { 11 tt/=15 ; //得到a和b進攻的總數 12 /* <b隊進攻的次數為>*/ 13 nb=(tt>>1); 14 bb+=nb; //此時b隊的得分 15 na=tt-nb; 16 memset(cc2,0,sizeof(cc2)); 17 for(i=1;i<=3*na;i++)cc1[i]=1; 18 for(i=1;i<na;i++) 19 { 20 for(j=1;j<=3 ;j++) 21 { 22 for(k=1;k<=i*3;k++) 23 { 24 cc2[k+j]+=cc1[k]; 25 } 26 } 27 for(k=1;k<=(i+1)*3 ;k++) 28 { 29 cc1[k]=cc2[k]; 30 cc2[k]=0; 31 } 32 } 33 __int64 res=0; 34 if(bb<aa) 35 { 36 if(!tt) res=1; 37 i=1; 38 } 39 else i=bb-aa+1; 40 for( ;i<=3*na ;i++) 41 res+=cc1[i]; 42 printf("%I64dn",res); 43 } 44 return 0; 45 }