问题分析
这道题纯数学,考察贝叶斯公式
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];//输入Pifor(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;
}