• #1075 : 开锁魔法III


    描述

    一日,崔克茜来到小马镇表演魔法。

    其中有一个节目是开锁咒:舞台上有 n 个盒子,每个盒子中有一把钥匙,对于每个盒子而言有且仅有一把钥匙能打开它。初始时,崔克茜将会随机地选择 k 个盒子用魔法将它们打开。崔克茜想知道最后所有盒子都被打开的概率,你能帮助她回答这个问题吗?

    输入

    第一行一个整数 T (T ≤ 100)表示数据组数。 对于每组数据,第一行有两个整数 n 和 k (1 ≤ n ≤ 300, 0 ≤ k ≤ n)。 第二行有 n 个整数 ai,表示第 i 个盒子中,装有可以打开第 ai 个盒子的钥匙。

    输出

    对于每组询问,输出一行表示对应的答案。要求相对误差不超过四位小数。

    样例输入
    4
    5 1
    2 5 4 3 1
    5 2
    2 5 4 3 1
    5 3
    2 5 4 3 1
    5 4
    2 5 4 3 1
    样例输出
    0.000000000
    0.600000000
    0.900000000
    1.000000000
     对于每个盒子而言有且仅有一把钥匙能打开它意味着这是若干个简单环,只需要每个环。
    那么我们可以DP,设f[i][j]表示前i个环满足条件且已选了j个的方案。状态转移时需要得到组合数。
    或许你会问会爆精度怎么办,因为求的是概率只需用double或long double保存就行了。
    #include<cstdio>
    #include<cctype>
    #include<queue>
    #include<cmath>
    #include<cstring>
    #include<algorithm>
    #define rep(i,s,t) for(int i=s;i<=t;i++)
    #define dwn(i,s,t) for(int i=s;i>=t;i--)
    #define ren for(int i=first[x];i;i=next[i])
    using namespace std;
    inline int read() {
        int x=0,f=1;char c=getchar();
        for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
        for(;isdigit(c);c=getchar()) x=x*10+c-'0';
        return x*f;
    }
    const int maxn=310;
    int n,k,size[maxn],cnt,v[maxn],vis[maxn];
    double f[maxn][maxn],C[maxn][maxn];
    int main() {
        int T=read();
        C[0][0]=1;
        rep(i,0,300) rep(j,0,i) C[i+1][j+1]+=C[i][j],C[i+1][j]+=C[i][j];
        while(T--) {
            n=read();k=read();cnt=0;
            memset(size,0,sizeof(size));
            memset(vis,0,sizeof(vis));
            rep(i,1,n) v[i]=read();
            rep(i,1,n) if(!vis[i]) {
                cnt++;int j=i;
                do size[cnt]++,vis[j]=1,j=v[j];while(j!=i);
            }
            memset(f,0,sizeof(f));
            f[1][0]=1.0;int cur=0;
            rep(i,1,cnt) {
                rep(j,0,cur) rep(k0,1,size[i]) f[i+1][j+k0]+=f[i][j]*C[size[i]][k0];
                cur+=size[i];
            }
            printf("%.6lf
    ",f[cnt+1][k]/C[n][k]);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    zabbix之自定义告警
    Appium获取toast消息
    fiddler在小米8下抓取https数据包.
    shell 获取指定ip的丢包率
    打造个人多媒体服务器之二
    关于pycharm+opencv没有代码提示的问题解决方法记录
    chrome出现“由贵单位管理”原因及解决方法
    jQuery 页面加载后执行的事件(3 种方式)
    VSCode
    2019.7月-前端面试总结(H5+C3+JS+ES6+Vue+浏览器)
  • 原文地址:https://www.cnblogs.com/wzj-is-a-juruo/p/4802655.html
Copyright © 2020-2023  润新知