彩票中奖几率

本文介绍了一个彩票机器的算法实现,该机器可以根据不同的参数设置产生不同数量的彩票组合,进而影响中奖几率。通过动态规划等手段,实现了对各种参数组合下彩票数量的有效计算,并根据中奖几率对这些组合进行了排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述
BSNY发明了一种彩票机器,能产生彩票中奖数字,并且有多种模式可以选择。使用前,BSNY首先要输入4个参数:C, B , S, U,分别代表有多少个候选数字,产生多少个数字,符合从左到右不下降排序,符合数字不重复。其中,S, U的输入只能是“T”或“F”(“T”表示一定这样排序和不重复,“F”表示无所谓)。
例如C=20, B=4,表示有1到20个连续数字,从中取4个构造彩票中奖号码。那么,产生{3,7,12,14}的这样彩票,在任何情况下都是有效;
产生{13,4,1,9}这样的彩票,只有在S=“F”的情况下有效的;
产生{8,8,8,15}这样的彩票,只有在U=”F”的情况下有效的;
产生{11,6,2,6}这样的彩票,只有在S=“F”且U=”F”的情况下有效的;
这样的话,根据C, B, S, U的参数不同,产生不同彩票的数量就不同,中奖几率也不同(中奖几率=1 / 不同彩票的数量)。
现在BSNY有n种参数,希望你根据中奖几率从大到小给他们排序(如果几率一样,编号小的在前)。

输入
第一行输入n
接下来n行,每行输入4个参数

输出
输出排序,格式参照样例

样例输入
4
2 2 T T
2 2 F F
2 2 T F
2 2 F T
样例输出
1
4
3
2
提示
【样例说明】
C=2, B=2的情况下,可以构造{1, 1},{1, 2},{2, 1},{2,2},其中
2 2 T T只能构造{1, 2},中奖概率为100%
2 2 F T只能构造{1, 2}, {2, 1},中奖概率为50%
2 2 T F只能构造{1, 2}, {1, 1},{2, 2},中奖概率为33%
2 2 F F可以构造全部,中奖概率25%
【数据规模和约定】
1<=n=1000, 1<=C<=50, 1<=B<=10, B<=C

这题作为第三题,真是水得可以。。。

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define ll long long
using namespace std;
ll ty;
int t,n,m,w,tot;
char x[5],y[5];
ll f[15][55];
struct node
{
    ll v;
    int id;
}ans[1005];
void dp(int x)
{
    for(int i=1;i<=n;i++) f[1][i]=1; //第几位以什么结尾 
    for(int i=2;i<=m;i++) 
    for(int j=1;j<=n;j++) 
    {
        f[i][j]=0;
        if(x==0) 
            for(int k=1;k<=j;k++) f[i][j]=f[i][j]+f[i-1][k]; //重复 
        else
            for(int k=1;k<j;k++) f[i][j]=f[i][j]+f[i-1][k];  //不重复 
    }
    for(int i=1;i<=n;i++) ans[w].v=ans[w].v+f[m][i];
}
bool cmp(node x,node y)
{
    if(x.v!=y.v) return x.v<y.v;else return x.id<y.id;
}
int main()
{
    cin>>t;
    for(w=1;w<=t;w++) 
    {
        scanf("%d%d%s%s",&n,&m,x,y); 
        if(x[0]=='F'&&y[0]=='F') //n^m
        {
            ty=1;
            for(int i=1;i<=m;i++) ty=ty*n;
            ans[w].v=ty;
        }
        if(x[0]=='F'&&y[0]=='T') //n*(n-1)*(n-2)*...(n-m+1) 
        {
            ty=1;
            int lwq=n;
            for(int i=1;i<=m;i++) 
            {
                ty=ty*lwq; 
                lwq--;
            }
            ans[w].v=ty;
        }
        if(x[0]=='T'&&y[0]=='F') dp(0); //不下降 可重复 
        if(x[0]=='T'&&y[0]=='T') dp(1); //不下降 不重复
        ans[w].id=w;
    }
    sort(ans+1,ans+t+1,cmp);
    for(int i=1;i<=t;i++) printf("%d\n",ans[i].id);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值