Mr.W


私信TA

用户名:uq_17130651193

访问量:436

签 名:

等  级
排  名 49139
经  验 295
参赛次数 1
文章发表 1
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

TA的其他文章

贝叶斯乱搞
浏览:387

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

  评论区

  • «
  • »