hdu 4504
威威貓系列故事——籃球夢
Time Limit: 300/100 MS (Java/Others)????Memory Limit: 65535/32768 K (Java/Others)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 6Hint 樣例解析: 當前比分是88:90,還剩50秒則對方還最多有一次進攻機會(最后5秒進攻不成功),我方有兩次,對方的最終得分將是91, 我方至少在兩回合中拿到4分才能勝利,所以所有方案數是6種,即:第一球 第二球 1 3 2 2 2 3 3 1 3 2 3 3 解題思路:dp[i][j]表示前i次進攻得到j分的方案數,分析下哪些狀態可以轉移到它,dp[i-1][j-1],dp[i-1][j-2],dp[i-1][j-3]。那么轉移方程就很簡單了。 #include<iostream> #include<cstdio> #include<cstring> using namespace std;int a,b,t; __int64 dp[25][205];int main() {while(scanf("%d%d%d",&a,&b,&t)!=EOF){t = t / 15; //兩邊可以打多少次進攻int n = t / 2 + (t % 2);int m = b + t - n; //對方最終得分int d = m - a + 1; //我方最少還需要得多少分__int64 ans;if(d <= 0){ans = 1;for(int i = 1; i <= n; i++)ans = ans * 3;}else{memset(dp,0,sizeof(dp));dp[1][1] = dp[1][2] = dp[1][3] = 1;for(int i = 2; i <= n; i++)for(int j = 1; j <= 200; j++){dp[i][j] += dp[i-1][j-1];if(j >= 2)dp[i][j] += dp[i-1][j-2];if(j >= 3)dp[i][j] += dp[i-1][j-3];}ans = 0;for(int i = d; i <= 200; i++)ans += dp[n][i];}printf("%I64d\n",ans);}return 0; }
總結
- 上一篇: Eclipse 反编译插件JadClip
- 下一篇: hdu 4506(快速幂+找规律)