【题意】现在有一些线索,每个线索被发现的概率p[i],如果线索i被知道,那么其他线索也可能会被知道,用vector<string> c给出,c[i][j]=‘Y‘表示知道i这个线索,j这个线索能直接知道,问最终发现的线索个数的期望。
所有p[i]的和不是1...
求每个clue被选中的概率,由题意,如果知道第i个数,那么可以立即知道其他一些点,那么可以先用floyd,求出当知道结点i后应该知道哪些结点。
然后两重求反,1-(1-p[i1])(1-p[i2])...(1-p[ik])就是所求答案,其中选中i1,i2,...,ik中的任意一个都能选中i。
#include<cstdio> #include<cstring> #include<cmath> #include<iostream> #include<algorithm> #include<set> #include<map> #include<stack> #include<vector> #include<queue> #include<string> #include<sstream> #define eps 1e-9 #define ALL(x) x.begin(),x.end() #define INS(x) inserter(x,x.begin()) #define FOR(i,j,k) for(int i=j;i<=k;i++) #define MAXN 1005 #define MAXM 40005 #define INF 0x3fffffff using namespace std; typedef long long LL; int i,j,k,n,m,x,y,T,ans,big,cas,num; bool flag; double pa[MAXN]; class TheTips { public: double solve(vector <string> c, vector <int> p) { int n=c.size(); for (k=0;k<n;k++) { for (i=0;i<n;i++) { for (j=0;j<n;j++) { if (i==j || j==k || i==k) continue; if (c[i][k]==‘Y‘&& c[k][j]==‘Y‘) c[i][j]=‘Y‘; } } } for (i=0;i<n;i++) c[i][i]=‘Y‘; for (i=0;i<n;i++) pa[i]=1; //for (i=0;i<n;i++) cout<<c[i]<<endl; for (j=0;j<n;j++) { for (i=0;i<n;i++) { if (c[i][j]==‘Y‘) { pa[j]*=1-p[i]*0.01; } } } //for (i=0;i<n;i++) printf("%d %f\n",i,pa[i]); double ans=0; for (i=0;i<n;i++) { ans+=1-pa[i]; } return ans; } };
时间: 2024-10-21 17:47:07