解题思路:
妥妥的贝叶斯公式套一套即可得出答案,不过要先算出在所有故障发生的情况下对应故障原因所发生的概率是多少,可以通过给出的发生了故障的情况去计算,若某个故障现象发生了,那么直接用输入的概率即可,若没发生则使用相反概率(即用1减去)即可。


其他的就看公式自己套一套就行。


参考代码:

#include <bits/stdc++.h>
#define ld long double
using namespace std;

const int N = 45, M = 25;
int n, m, k;
int p[N], pp[N][M];
pair<ld, int> ppp[N];
bool happen[M];

int main() {
  cin >> n >> m;
  for (int i = 1; i <= n; i++) cin >> p[i];

  for (int i = 1; i <= n; i++) {
    ppp[i].second = i;
    for (int j = 1; j <= m; j++) {
      cin >> pp[i][j];
    }
  }

  cin >> k;
  for (int i = 0, x; i < k; i++) {
    cin >> x;
    happen[x] = true;
  }

  ld s = 0;
  for (int i = 1; i <= n; i++) {
    ld &x = ppp[i].first;
    x = p[i] / 100.0;
    for (int j = 1; j <= m; j++) {
      if (happen[j]) x *= pp[i][j] / 100.0;
      else x *= (100 - pp[i][j]) / 100.0;
    }
    s += x;
  }

  sort(ppp + 1, ppp + n + 1, [&](pair<ld, int> a, pair<ld, int> b) {
    if (a.first == b.first) return a.second < b.second;
    return a.first > b.first;
  });
  
  for (int i = 1; i <= n; i++) {
    printf("%d %.2Lf\n", ppp[i].second, !s ? 0.0 : ppp[i].first * 100 / s);
  }

  return 0;
}


点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论