【试题描述】
小M十分迷恋篮球比赛,是忠实的NBA球迷,他常常幻想自己那肥硕的身躯也能飞起扣篮。另外,他对篮球教练工作也情有独钟,特别是对比赛的战术,投篮选择方面也是很有研究,下面就是小M研究过的一个问题。
一场NBA篮球比赛总共48分钟,假如我们现在已经知道当前比分 A:B,A代表我方的比分,B代表对方的比分,现在比赛还剩下t秒时间。我们简单的认为双方各自进攻一次的时间皆固定为15秒(不到15秒则进攻不得分),且为交替进攻,即我方进攻一次,接着对方进攻,依次循环。
进攻有三种选择方式:(这里不考虑命中率)
1、造犯规,(假设都两罚一中)得1分;
2、中距离投篮得2分;
3、三分球得3分。
为了简化问题,假设在对方回合,由于我方防守比较好,只让对手得1分,且为固定,即对方的进攻回合就为每回合得1分。现在比赛进入最后关头,接下来第一个回合是我方进攻,现在小M想要知道教练有多少种不同的选择能使我方可能赢得比赛(可能的意思就是不考虑命中率的情况)。
【输入说明】
在程序当前路径下存在文本文件execute.stdin,程序从execute.stdin中读取输入数据。
execute.stdin为单行,存放着空格隔开的3个整数A,B和t,其中A和B表示当前的比分(0<= A, B <= 200),t表示还剩多少时间(单位秒 0 <= t <= 600)。
【输出说明】
请输出可行的方案数。
【示例】
输入数据:
88 90 50
输出数据:
6
样例解析:
当前比分是88:90,还剩50秒则对方还最多有一次进攻机会(最后5秒进攻不成功),我方有两次,对方的最终得分将是91,
我方至少在两回合中拿到4分才能胜利,所以所有方案数是6种,即:
第一球第二球
1 3
2 2
2 3
3 1
3 2
3 3
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define maxn 205
__int64 cc1[maxn], cc2[maxn];
int main()
{
int aa, bb, tt, nb, i, j, na, k;
while (scanf("%d%d%d", &aa, &bb, &tt) != EOF)
{
tt /= 15; //得到a和b进攻的总数
/* <b队进攻的次数为>*/
nb = (tt >> 1);
bb += nb; //此时b队的得分
na = tt - nb;
memset(cc2, 0, sizeof(cc2));
for (i = 1; i <= 3 * na; i++)cc1[i] = 1;
for (i = 1; i < na; i++)
{
for (j = 1; j <= 3; j++)
{
for (k = 1; k <= i * 3; k++)
{
cc2[k + j] += cc1[k];
}
}
for (k = 1; k <= (i + 1) * 3; k++)
{
cc1[k] = cc2[k];
cc2[k] = 0;
}
}
__int64 res = 0;
if (bb < aa)
{
if (!tt) res = 1;
i = 1;
}
else i = bb - aa + 1;
for (; i <= 3 * na; i++)
res += cc1[i];
printf("%I64d\n", res);
}
return 0;
}