NC23413 小A买彩票

小A买彩票

https://ac.nowcoder.com/acm/problem/23413

题解:这个题既然我们要求他不亏本的概率,那么我们就需要找出所有的情况和不亏本的情况。
然后用不亏本的情况,也就是说总钱数要大于等于3*n的情况数来除以总的情况数。
接下来就可以用dp的方法做题了。
dp[i][j]代表前i个彩票中奖的钱数为j的方案数。
然后就相当于是一个递推式。

dp[i][j]+=dp[i-1][j-k](前提:j大于等于k,k可以取1,2,3,4)
为什么这么写呢,是因为我要买第i张彩票了,中的奖金为k元,那么我们的总奖金就是j-k+k元,可以从前一张彩票的价格推过来。

最后一个问题,最后的分数他有可能不是最简形式,这样的话我们就可以给他化简,找出两者的最大公约数,然后同时除以这个最大公约数即可。

/*Keep on going Never give up*/
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
const int maxn = 2e5+10;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int mod = 100000000;
using namespace std;
ll dp[50][200];

int main()
{
    ll n;
    cin>>n;
    dp[0][0]=1;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=i*4;j++){
            for(int k=1;k<=4;k++){
                if(j>=k){
                    dp[i][j]+=dp[i-1][j-k];
                    //printf("前%d个彩票,多少%d钱的 方案%d\n",i,j,dp[i][j]);
                }
            }
        }
    }
    ll ans1=0,ans2=0;
    for(int i=n;i<=n*4;i++){
        if(i>=n*3) ans1+=dp[n][i];
        ans2+=dp[n][i];
    }
    ll gcd=__gcd(ans1,ans2);
    printf("%lld/%lld",ans1/gcd,ans2/gcd);
    return 0;
}
题解 文章被收录于专栏

主要写一些题目的题解

全部评论

相关推荐

蚂蚁 基架java (n+6)*16 签字费若干
点赞 评论 收藏
分享
在评审的大师兄很完美:像这种一般就是部门不匹配 转移至其他部门然后挂掉 我就是这样被挂了
点赞 评论 收藏
分享
10-27 17:26
东北大学 Java
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
11-21 19:05
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务