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;
}
题解 文章被收录于专栏
主要写一些题目的题解
曼迪匹艾公司福利 95人发布