3602: 中奖啦!(史上最强水解!!!没有之一!!!)

3602: 中奖啦! 

时间限制(普通/Java):1000MS/3000MS     内存限制:65536KByte

描述

L超时由于最近销售量特别好。为答谢广大的顾客,L公司准备举行抽奖活动。而规则如下:超市会发行一批刮奖卡,每张刮奖卡刮开上面的图层会,会出现几种图案中的一种(每种图案出现的几率是一样的),只要集齐n种图案就算中奖。现在某人买了m张卡片,你能算出他中奖的概率P是多少么?

输入

有多组测试数据。
每组数据只有一行,包含2个数字n,m(1<=n,m<=10),分别代表图案的种类与某人购买的卡片的数量。

输入以0 0结束。

输出

每组数据输出占一行,是1个实数P,即中奖概率(P保留4位小数)。

样例输入

样例输出


emmmm、、、这是一道概率论的题目。基本模型是有放回摸球模型,具体的百度模型应该很多

、、、说了这么多,我也不会做啊!不过有些题总有水的做法!

下面附上dfs打表代码(emmmm、、、差不多运行半小时能出全部结果吧、、、或许加记忆化搜索能更快点、):

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<cstring>
#include<string>
#include<set>
#include<cmath>
#define ll long long
#define INF 0x3f3f3f3f
#define N 1005
using namespace std;


ll n,m,sum,mm;
ll a[11];
set<int> s;
set<int>::iterator it;
void dfs(int cnt)
{
// cout<<s.size()<<' '<<endl;
// for(it=s.begin();it!=s.end();it++)
// cout<<*it<<' ';cout<<endl;
if(s.size()==n)
{
// cout<<"pow"<<pow(n,m-cnt)<<endl;
sum+=pow(n,m-cnt);
return;
}
if(cnt==m&&s.size()<n){
return;
}
for(int i=1;i<=n;i++)
{
s.insert(i);
a[i]++;
dfs(cnt+1);
a[i]--;
if(!a[i])
{
it=s.find(i);
s.erase(it);
}
}
}


int main()
{
for(int i=1;i<=10;i++){
for(int j=1;j<=10;j++){
sum=0;
s.clear();
n=i;m=j;
memset(a,0,sizeof(a));
mm=pow(n,m);
dfs(0);
double x=1.0*sum/mm;
if(x>1) x=1;
printf("%.4lf,",x);
}cout<<endl;
}cout<<"end"<<endl;
return 0;
}

这就是上面程序打出来的表AC的啦!(话说一觉睡醒表打完还真过了!哈哈哈。。。)

note:其实时间主要花在10 10打最后一个数上,由规律可得输入10 10的概率大于0小于0.0009,那么多交几次就AC啦!

#include<cstdio>
double a[10][10]={1.0000,1.0000,1.0000,1.0000,1.0000,1.0000,1.0000,1.0000,1.0000,1.0000,
0.0000,0.5000,0.7500,0.8750,0.9375,0.9688,0.9844,0.9922,0.9961,0.9980,
0.0000,0.0000,0.2222,0.4444,0.6173,0.7407,0.8258,0.8834,0.9221,0.9480,
0.0000,0.0000,0.0000,0.0938,0.2344,0.3809,0.5127,0.6229,0.7114,0.7806,
0.0000,0.0000,0.0000,0.0000,0.0384,0.1152,0.2150,0.3226,0.4271,0.5225,
0.0000,0.0000,0.0000,0.0000,0.0000,0.0154,0.0540,0.1140,0.1890,0.2718,
0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0061,0.0245,0.0577,0.1049,
0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0024,0.0108,0.0282,
0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0009,0.0047,
0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0004
};
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m),n||m)
{
printf("%.4lf\n",a[n-1][m-1]);
}
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值