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

【试题描述】

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


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值