1. 题意

    个骰子,骰子有不同的骰面数量,骰面数值

    问任选两个骰子投出相同数字的最大概率

  2. 数据范围:

  3. 一眼

    ----(概率)

    第一个骰子有四面,第二个有5面

    1 1 2 2----第一个

    1 2 3 4 5----第二个

    第一个骰子投出的概率为

    投出的概率为

    第二个骰子投出的概率为

    投出的概率为

    那么两个骰子一起投出的概率就是

    两个骰子一起投出的概率就是

    两个骰子投出相同数字的概率就是

    4.贴代码吧

    定义p[i][j]为第个个骰子投出的概率

    siz[i]为第个骰子有多少面

    val[i][j]表示第个骰子第面的数值

    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    const int M=4e5+110;
    const int N=1e2+10;
    double P[N][M],m,n,siz[M],top=0,maxx=-1;
    int val[N][M];
    signed main(){
    	cin>>n;
    	for(int i=1;i<=n;i++){
    		cin>>siz[i];
    		for(int j=1;j<=siz[i];j++){
    			cin>>val[i][j];
               //分配律
    			P[i][val[i][j]]+=(1/siz[i]);
    		}
    	}
    	for(int i1=1;i1<=n;i1++){//枚举骰子
    		for(int i2=i1+1;i2<=n;i2++){
    			double ans=0;
    			bool vis[M];
    			memset(vis,0,sizeof(vis));
    			for(int j=1;j<=siz[i1];j++)
    				if(!vis[val[i1][j]])
    					vis[val[i1][j]]=1,
    					ans+=P[i1][val[i1][j]]*P[i2][val[i1][j]];
    			maxx=max(maxx,ans);
    		}
    	}
    	printf("%.15lf\n",maxx);
    }
    /*
    3
    5 1 1 1 1 1
    4 2 2 2 2
    3 1 1 2
    */