zoukankan      html  css  js  c++  java
  • lightoj 1064 Throwing Dice

      题意:给你n个骰子,求n个骰子的和不小于x的概率。

      刚开始想每给一组数就计算一次~~太笨了- -,看了别人的代码,用dp,而且是一次就初始化完成,每次取对应的数据就行了。WA了好多次啊,首先不明白的就是:

    for(int i=1;i<=25;i++) for(int j=i*6;j>=0;j--) dp[i][j]+=dp[i][j+1];

      这段代码不清楚干什么用的,想清楚没?

      刚开始求的dp[i][j]表示的是前 i 个骰子掷出总和为 j 的概率 ,题意让求总和不小于 j 的概率,所以把大于 j 的要加上。

      然后输出的又WA了好几次~~

      有概率为0和1的情况,就不能输出分数形式。

    #include<stdio.h>
    #include<string.h>
    #define N 30
    #define LL long long
    
    LL dp[N][N*6],p[N];
    void Init()
    {
        memset(dp,0,sizeof(dp));
        p[0]=1;
        for(int i=1;i<=25;i++)  p[i]=p[i-1]*6;
        for(int i=1;i<=6;i++)   dp[1][i]=1;
        for(int i=2;i<=25;i++)
            for(int j=i;j<=i*6;j++)
                for(int k=1;k<=6;k++)
                    if((j-k)>=i-1)
                        dp[i][j]+=dp[i-1][j-k];
        for(int i=1;i<=25;i++) for(int j=i*6;j>=0;j--) dp[i][j]+=dp[i][j+1];
    }
    LL Gcd(LL a,LL b)
    {
        return b?Gcd(b,a%b):a;
    }
    int main()
    {
        Init();
        int T,cas=1;
        int n,x;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d%d",&n,&x);
            LL a=p[n];
            LL b=dp[n][x];
            LL yu = Gcd(a,b);
            if(a/yu==1)    printf("Case %d: %lld
    ",cas++,b/yu);
            else    printf("Case %d: %lld/%lld
    ",cas++,b/yu,a/yu);
        }
        return 0;
    }
  • 相关阅读:
    算术入门之加减乘除
    scanf的返回值
    Flutter 开发环境配置
    DbContextOptionsBuilder
    MarkDown 的简单用法
    C# 多线程安全集合类
    .NET Core 中使用 MemoryCache 缓存
    JWT
    什么是跨域?跨域解决方法
    .Net Core 中配置的高级用法
  • 原文地址:https://www.cnblogs.com/yongren1zu/p/3250069.html
Copyright © 2011-2022 走看看