HDUOJ 4504 排列组合

来源:互联网 发布:爱如生数据库 编辑:程序博客网 时间:2024/05/17 23:33

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

6

Hint

 样例解析: 当前比分是88:90,还剩50秒则对方还最多有一次进攻机会(最后5秒进攻不成功),我方有两次,对方的最终得分将是91, 我方至少在两回合中拿到4分才能胜利,所以所有方案数是6种,即: 第一球 第二球 1 3 2 2 2 3 3 1 3 2 3 3 


这题好像大部分人都用DP解,其实只要暴力枚举每种进攻的次数,进行简单组合就能解。


直接上代码:


#include<iostream>#include<cstdio>#include<cmath>#include<algorithm>#include<cstring>#include<string>#include<vector>#include<queue>#include<ctype.h>#include<bitset>#include<map># pragma comment (linker,"/STACK:16777216")using namespace std;const int MAXN = 305;const int INF  = 2100000000;const double esp = 1e-9;long long jiecheng(long long num){    long long res = 1;    for(int i = 1; i <= num; i++)    {        res *= i;    }    return res;}int main(){    //freopen("C:/Users/zts/Desktop/in.txt", "r", stdin);    int a, b, t;    while(scanf("%d%d%d", &a, &b, &t) != -1)    {        t = t/15;        b += t/2;        int x = b-a;        int n = (t+1)>>1;        long long ans = 0;        for(int i = 0; i <= n; i++)        {            for(int j = 0; j <= n-i; j++)            {                int k = n-i-j;                long long sum = i+j+k;                long long temp = jiecheng(sum);                temp /= jiecheng(i);                temp /= jiecheng(j);                temp /= jiecheng(k);                if(i+2*j+3*k > x) ans += temp;            }        }        printf("%I64d\n", ans);    }    return 0;}


0 0
原创粉丝点击