算法正确性应当无问题,求卡精度。
#include<bits/stdc++.h>
#define double long double
using namespace std;
const int N=45;
int n,m,k;
double p[N],b[N][N],dp[N];
bool vis[N];
pair<double,int> ans[N];
int main() {
cin >> n >> m;
for(int i=1;i<=n;++i) {cin >> p[i];p[i]/=100.0;}
for(int i=1;i<=n;++i) {
for(int j=1;j<=m;++j) {
cin >> b[i][j];
b[i][j]/=100.0;
}
}
cin >> k;
int id;
for(int i=1;i<=k;++i) {
cin >> id;
vis[id]=1;
}
for(int i=1;i<=n;++i) {
dp[i]=p[i];
for(int j=1;j<=m;++j) {
if(vis[j]) dp[i]=dp[i]*b[i][j];
else dp[i]=dp[i]*(1-b[i][j]);
}
}
double cnt=0;
for(int i=1;i<=n;++i) cnt+=dp[i];
for(int i=1;i<=n;++i) {
ans[i].second=i;
ans[i].first=dp[i]*100.0/cnt;
}
sort(ans+1,ans+1+n);
for(int i=n;i>=1;--i) {
cout << ans[i].second << ' ';
cout << fixed << setprecision(2) << ans[i].first << endl;
}
return 0;
}