贝叶斯公式
条件概率的运用,即发生A事件的条件下,B事件发生的概率。
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
typedef pair<int,double> PID;
int main()
{
int n,m;scanf("%d%d",&n,&m);
vector<vector<double>> a(n+1,vector<double>(m+1));
for(int i=1;i<=n;i++) scanf("%lf",&a[i][0]);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%lf",&a[i][j]);
vector<int> st(21);
int k;scanf("%d",&k);
while(k--)
{
int x;scanf("%d",&x);
st[x]=1;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(st[j]) a[i][0]=a[i][0]*a[i][j]*0.01;
else a[i][0]=a[i][0]*(100-a[i][j])*0.01;
double d=0;
for(int i=1;i<=n;i++)
d+=a[i][0];
vector<PID> c(n);
for(int i=0;i<n;i++)
c[i]={i+1,a[i+1][0]/d};
sort(c.begin(),c.end(),[&](PID A,PID B){
if(fabs(A.second-B.second)<1e-8) return A.first<B.first;
else return A.second>B.second;
});
for(int i=0;i<n;i++)
printf("%d %.2f\n",c[i].first,c[i].second*100);
return 0;
}