问题分析
这道题纯数学,考察贝叶斯公式
AC_Code
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,double> PI;
bool cmp(PI a,PI b){
if(a.second!=b.second)return a.second>b.second;
return a.first<b.first;
}
int main() {
int n,m,k;
cin>>n>>m;
vector<vector<double> >p(n,vector<double>(m+1,0));
vector<bool> st(m+1,false);
for(int i=0;i<n;i++)cin>>p[i][0];//输入Pi
for(int i=0;i<n;i++){
for(int j=1;j<=m;j++){
cin>>p[i][j];//输入Pij
}
}
cin>>k;
int t;
while(k--){
cin>>t;
st[t]=true;//标记哪些现象发生
}
vector<PI> ans;
double dn=0;
for(int i=0;i<n;i++){
for(int j=1;j<=m;j++){//计算该原因发生该现象的概率
if(st[j])p[i][0]=p[i][0]*0.01*p[i][j];
else p[i][0]=p[i][0]*0.01*(100-p[i][j]);
}
dn+=p[i][0];//计算分母
}
for(int i=0;i<n;i++){
ans.push_back({i+1,p[i][0]*100/dn});
}
sort(ans.begin(),ans.end(),cmp);
for(int i=0;i<n;i++){
cout<<ans[i].first<<" "<<fixed<<setprecision(2)<<ans[i].second<<endl;
}
return 0;
}