您的位置:首页 > 其它

彩票中奖几率

2016-07-14 14:17 211 查看
题目描述

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: