点击打开链接
题目描述
输入
输出
样例输入
2
2 1
0 1
1 0
3 1
0 1 1
1 0 1
1 1 0
样例输出
0.500
1.125
是要求出社交花 数量 的期望。与 >= k个男人有关系的女性是交际花。
思路是:求出每个人 是 社交花的期望,加起来,就是ans。
用一个 pic[][] 存图,pic[i] 是第 i 个人的关系情况。
比如:pic[i] 与 m 个人有关系 ,当 m >= k,这个人才有可能是 交际花。
这个人的关系中(包括这个人),性别的总种类数是 2^(m + 1). ----分母。
分子----m个人中有 k 个那人的种类 + m 中有 (k+1)个男人的种类.......+ (k + j)。。。。(k + j) <=n..
..
学到了组合数打表
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
int dp[50][50];
void Init()
{
for(int i = 0;i < 40;i ++)
{
dp[i][1] = i;
dp[i][0] = 1;
}
for(int i = 2;i < 40;i ++)
{
for(int j = 2;j <= i;j ++)
{
dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];
}
}
}
int pic[40][40];
int friden_i[40]; //记录与第 i 个人有关系的人数
int main()
{
int t;
cin>>t;
Init();
while(t --)
{
int n,k;
double ans = 0;
memset(friden_i,0,sizeof(friden_i)); //别忘了每次初始化
cin>>n>>k;
//存图
for(int i = 1;i <= n;i ++)
{
for(int j = 1;j <= n;j ++)
{
cin>>pic[i][j];
if(pic[i][j])
friden_i[i] ++;
}
}
for(int i = 1;i <= n;i ++)
{
for(int j = k;j <= n;j ++)
{
ans += (double)dp[friden_i[i]][j] / pow(2,friden_i[i] + 1);
}
}
printf("%.3lf\n",ans);
}
return 0;
}