列表

详情


NC206654. 一人一张的消费券

描述

UPUP市为了促进经济发展,推出了非常实惠的消费券政策,市里的每个人都可以免费得到一张面值为 a 或 b , 的消费券,这些消费券都等同于同样面值的UPUP市当前流通货币。

现在有 n 个人去电影院看电影,已知电影票价格恰好为上面提到的 a。这 n 个人排成一队去买票,即一次只能有一个人买票。但是电影院之前已经把所有钱赔光了,即电影院当前账户余额为 0。电影院的收费方式是直接收走消费券,将多出的钱 (可能为 0) 通过微信返回。

已知这些人会等概率随机排列,问能让电影院对每个人都能成功找零的概率。

成功找零即对每个人来说必须是立即结算的,也即必须在下一个人开始买之前找零。

输入描述

- 一行,两个非负整数 
- 一行,两个正整数

输出描述

输出一个小数 p,代表能成功找零的概率,当答案与标准答案的绝对值差小于  时,认为答案正确

示例1

输入:

2 3
2 4

输出:

0.4000000

说明:

编号为1,2为a,编号3,4,5为b
1 2 3 4 5
1 3 5 4 2
2 3 5 4 1
都是合法的
即使是拿着一类消费券的人也是不同的

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 4ms, 内存消耗: 492K, 提交时间: 2020-05-24 17:08:18

//K---point 8 wa
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
	long long na,nb,n,a,b;
	scanf("%lld%lld",&na,&nb);
	scanf("%lld%lld",&a,&b);
	n=na+nb;
	long double ans=1;
	long long p;
	if((b-a)%a==0) p=(b-a)/a;
	else p=(b-a)/a+1;
	if(nb==0) printf("1");
	else if(p>na) printf("0.0000000");
	else{
		for(int i=0;i<p;i++)
			ans*=((long double)(na-i)/(long double)(n-i));
		printf("%.15Lf",ans);
	}
 } 

C++11(clang++ 3.9) 解法, 执行用时: 5ms, 内存消耗: 488K, 提交时间: 2020-05-25 23:46:27

#include<iostream>
#include<cstdio>
int a,b,na,nb;
int main()
{
	scanf("%d%d%d%d",&na,&nb,&a,&b);
	b-=a;
	int now=0,t=0;
	while(now<b&&t<na) now+=a,t++;
	if(nb==0) printf("1\n");
	else if(now<b) printf("0\n");
	else
	{
		long double ans=1;
		for(int j=0;j<t;j++)
		ans=ans*(na-j)/(na+nb-j);
		printf("%.10f\n",(double)ans);
	}
	return 0;
}

上一题