import java.util.*;
class Main{
public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
long [][]a=new long[25][210];//这里要注意用long数组,不然就会溢出;
a[0][0]=1;
for(int i=1;i<25;i++){//i表示的是场数;
for(int j=i-1;j<=3*(i-1);j++){//j表示的是分数;
if(a[i-1][j]!=0){//这个数组是用来记录各个分数的情况,后一场等于前一场情况相加;
a[i][j+1]+=a[i-1][j];
a[i][j+2]+=a[i-1][j];
a[i][j+3]+=a[i-1][j];
}
}
}
while(cin.hasNext()){
int n=cin.nextInt();
int m=cin.nextInt();
int t=cin.nextInt();
int s=0;
s=(t/15+1)/2;
long sum=0;
for(int i=Math.max( s,((m-n)+(t/15)-s+1));i<=3*s;i++){
sum+=a[s][i];
}
System.out.println(sum);
}
}
}
这个题目用java很容易超时,那个动态数组要放在外面才不会超时;
威威猫系列故事——篮球梦
Time Limit: 300/100 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 3896 Accepted Submission(s):
1015
一场NBA篮球比赛总共48分钟,假如我们现在已经知道当前比分
A:B,A代表我方的比分,B代表对方的比分,现在比赛还剩下t秒时间。我们简单的认为双方各自进攻一次的时间皆固定为15秒(不到15秒则进攻不得分),且为交替进攻,即我方进攻一次,接着对方进攻,依次循环。
进攻有三种选择方式:(这里不考虑命中率)
1、造犯规,(假设都两罚一中)得1分;
2、中距离投篮
得2分;
3、三分球
得3分。
为了简化问题,假设在对方回合,由于我方防守比较好,只让对手得1分,且为固定,即对方的进攻回合就为每回合得1分。现在比赛进入最后关头,接下来第一个回合是我方进攻,现在威威猫想要知道教练有多少种不同的选择能使我方可能赢得比赛(可能的意思就是不考虑命中率的情况)。
每组数据包含3个整数A,B和t,其中A和B 表示当前的比分(0
<= A, B <= 200),t表示还剩多少时间(单位秒 0 <= t <= 600)。
样例解析:
当前比分是88:90,还剩50秒则对方还最多有一次进攻机会(最后5秒进攻不成功),我方有两次,对方的最终得分将是91,
我方至少在两回合中拿到4分才能胜利,所以所有方案数是6种,即