#include<iostream>
using namespace std;
const int M=1005;
int n,m,h;
int a[M];
int main(void) {
scanf("%d%d%d",&n,&m,&h);
int s=0;
for(int i=1; i<=m; i++) {
scanf("%d",&a[i]);
s+=a[i];
}
if(s<n) {
printf("-1");
return 0;
}
double res=1;
for(int i=1; i<a[h]; i++) {
res*=(double)(s-i-n+1)/(s-i);
}
printf("%lf",(double)1-res);
return 0;
}
- 首先,代码使用
scanf
函数从标准输入读取三个整数n、m和h,分别表示需要的元素数量、数组a的大小以及用于计算概率的索引。 - 接着,代码定义了一个整型变量s,用于保存数组a中前m个元素的和。
- 通过一个for循环,代码读取数组a中前m个元素的值,并将它们累加到s中。
- 如果s小于n,则输出-1,表示无法满足需求,程序结束。
- 如果s大于等于n,则定义一个双精度浮点型变量res,初始值为1,用于保存概率值。
- 接下来,代码通过一个for循环计算概率值res。在循环中,res乘以(s-i-n+1)/(s-i)的值,其中i从1遍历到a[h]-1。
- 最后,代码输出1减去res的值,表示所求的概率。
总体来说,这段代码的功能是计算满足一定条件的概率值。根据输入的n、m和h,它计算出一个特定的概率,并输出结果。