NC206654. 一人一张的消费券
描述
输入描述
- 一行,两个非负整数
- 一行,两个正整数
输出描述
输出一个小数 p,代表能成功找零的概率,当答案与标准答案的绝对值差小于 时,认为答案正确
示例1
输入:
2 3 2 4
输出:
0.4000000
说明:
编号为1,2为a,编号3,4,5为bC++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; }