联发科编程大赛_第六题小M的篮球梦

来源:互联网 发布:java web开发需求 编辑:程序博客网 时间:2024/05/18 03:38

【试题描述】

小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;}


原创粉丝点击