zzuli 1728: 社交网络(求期望值)

来源:互联网 发布:协和怎么挂号 知乎 编辑:程序博客网 时间:2024/06/05 20:48

http://acm.zzuli.edu.cn/zzuliacm/problem.php?id=1728

1728: 社交网络

Time Limit: 2 Sec  Memory Limit: 128 MB
Submit: 206  Solved: 50

SubmitStatusWeb Board

Description

 

Input

Output

Sample Input

22 10 11 03 10 1 11 0 11 1 0

Sample Output

0.5001.125

HINT

校赛那时候没来的及看这道题,后来做校赛重现赛时一直在研究这道题,推出了一个公式,自认为公式推的没有bug,交了n多次都是WA,补题时才发现了错误

求出第i个人认识的m个人中有(k---m)个男性的可能组合数,然后除以第i个人加上第i个人认识的m个人的总排列方案2^(val[i]+1);

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<queue>#include<cmath>using namespace std;#define N 110#define met(a, b) memset(a, b, sizeof(a))using namespace std;int a[N][N], val[N], dp[40][40];void Init(){    for (int i=1; 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] + dp[i-1][j-1];}int main (){    int t, n, k;    scanf ("%d", &t);    Init();///打表求组合数    while (t--)    {        met (a, 0);        met (val, 0);        scanf ("%d %d", &n, &k);        for (int i=1; i<=n; i++)            for (int j=1; j<=n; j++)            {                scanf ("%d", &a[i][j]);                if (a[i][j])                    val[i]++;            }        double cnt = 0;        for (int i=1; i<=n; i++)            for (int j=k; j<=n; j++)                if (val[i] >= j)                    cnt += (dp[val[i]][j]*1.0 / pow (2, val[i]+1));        printf ("%.3f\n", cnt);        //printf ("%.3f\n", 1.0/16.0);    }    return 0;}/*5 10 1 0 0 01 0 1 0 10 1 0 1 00 0 1 0 00 1 0 0 0*/


1 0
原创粉丝点击