【洛谷 P8804】[蓝桥杯 2022 国 B] 故障 题解(概率论+条件概率+贝叶斯公式)

news2025/2/27 14:02:55

[蓝桥杯 2022 国 B] 故障

题目描述

在软件或系统开发中,我们会遇到各种各样的故障。为了从故障现象反推故障原因,工程师们会总结一种叫做相关性矩阵的二维表格,来表示故障原因与故障现象之间的关系。比如:

其中每行表示一种故障原因,每一列表示一种故障现象。该矩阵表示故障原因 A A A 可能产生故障现象 2 2 2 3 3 3 4 4 4,故障原因 B B B 可能产生故障现象 1 1 1 3 3 3

在实际开发过程中,如果出现了故障原因,工程师就可以根据故障现象,去计算每种故障原因产生的概率,并按照概率大小对故障原因进行排查,以达到快速定位故障原因的目的。

现在,我们假设系统开发中同一时间只会出现一种故障原因, 并且故障原 因引起各故障现象是独立事件。举个例子来说:

假设系统现在发生了故障原因 A A A, 有 1 3 \frac{1}{3} 31 的概率出现故障现象 2 2 2,有 1 4 \frac{1}{4} 41 的概率出现故障现象 3 3 3,有 1 2 \frac{1}{2} 21 的概率出现故障现象 4 4 4。由于 3 3 3 种现象是独立发生的,因此有 1 2 × 3 × 4 \frac{1}{2 \times 3 \times 4} 2×3×41 的概率同时出现故障 2 2 2 3 3 3 4 4 4

约定若相关性矩阵中没有 x 记号, 则表示该故障原因一定不会产生某故障现象,比如故障原因 A A A,一定不会产生故障现象 1 1 1。根据历史经验数据,我们统计得到了每一种故障原因出现的概率以及每一种故障原因对应的故障现象产生概率。

现在已知系统出现的故障现象,求问各个故障原因发生的概率。

输入格式

1 1 1 行: 2 2 2 个正整数 N , M , N N, M, N N,M,N 表示故障原因的个数(编号 1 … N ) , M 1 \ldots N),M 1N)M 表示故障现象的个数(编号 1 … M 1 \ldots M 1M)。

2 2 2 行: N N N 个整数,第 i i i 个数表示故障原因 i i i 产生的概率 P i P_{i} Pi

3 … N + 2 3 \ldots N+2 3N+2 行:每行 M M M 个整数,第 i + 2 i+2 i+2 行第 j j j 个整数 P i j P_{i j} Pij 表示故障原因 i i i 出现故障现象 j j j 的概率(百分比)。

N + 3 N+3 N+3 行: 1 1 1 个正整数 K K K,表示目前出现的故障现象数量。

N + 4 N+4 N+4 行: K K K 个正整数,依次为当前出现的故障现象编号,不会重复。

输出格式

1 … N 1 \ldots N 1N 行:按概率从高到低输出每种故障原因及其可能的概率,若出现 概率相同则优先输出编号小的故障原因。第 1 1 1 个数为故障原因编号, 第 2 2 2 个数为故障概率(百分比),保留 2 2 2 位小数。

样例 #1

样例输入 #1

3 5
30 20 50
0 50 33 25 0
30 0 35 0 0
0 0 0 25 60
1
3

样例输出 #1

2 56.89
1 43.11
3 0.00

提示

对于所有测试用例, 1 ≤ N ≤ 40 , 1 ≤ M ≤ 20 , 0 ≤ P i ≤ 100 , ∑ ( P i ) = 100 1 \leq N \leq 40,1 \leq M \leq 20,0 \leq P_{i} \leq 100, \sum\left(P_{i}\right)=100 1N40,1M20,0Pi100,(Pi)=100, 0 ≤ P i j ≤ 100 0 \leq P_{i j} \leq 100 0Pij100

蓝桥杯 2022 国赛 B 组 G 题。


思路

贝叶斯公式是一种关于随机事件 A A A B B B 的条件概率的定理,其一般形式为:

P ( A ∣ B ) = P ( B ∣ A ) P ( A ) P ( B ) P(A|B) = \frac{P(B|A)P(A)}{P(B)} P(AB)=P(B)P(BA)P(A)

在这个问题中, A A A 表示故障原因, B B B 表示故障现象。 P ( A ∣ B ) P(A|B) P(AB) 就是在已知故障现象的情况下,故障原因 A A A 发生的概率,也就是我们需要求解的。 P ( B ∣ A ) P(B|A) P(BA) 是在已知故障原因的情况下,故障现象 B B B 发生的概率,这个概率在输入中给出。 P ( A ) P(A) P(A) 是故障原因 A A A 发生的概率,这个概率也在输入中给出。 P ( B ) P(B) P(B) 是故障现象 B B B 发生的概率,可以通过遍历所有的故障原因并将 P ( B ∣ A ) P ( A ) P(B|A)P(A) P(BA)P(A) 相加得到。

在计算 P ( A ∣ B ) P(A|B) P(AB) 的过程中,首先对于每个故障原因 i i i,计算其出现的概率 a a a,这个概率是由该故障原因出现的概率 p i [ i ] pi[i] pi[i] 和其引起所有出现的故障现象的概率的乘积得到的。如果故障现象 j j j 出现,那么就乘以 p i j [ i ] [ j ] pij[i][j] pij[i][j],否则乘以 1 − p i j [ i ] [ j ] 1 - pij[i][j] 1pij[i][j]。这就是计算 P ( B ∣ A ) P ( A ) P(B|A)P(A) P(BA)P(A) 的过程。然后将所有的 P ( B ∣ A ) P ( A ) P(B|A)P(A) P(BA)P(A) 相加得到 P ( B ) P(B) P(B),也就是变量 b b b

最后,对于每个故障原因 i i i,其出现的概率 P ( A ∣ B ) P(A|B) P(AB) 就等于 a / b a/b a/b,即 P ( B ∣ A ) P ( A ) / P ( B ) P(B|A)P(A)/P(B) P(BA)P(A)/P(B)

样例的相关性矩阵可以表示为:

12345
A05033250
B3003500
C0002560

首先通过scanf函数从输入中读取故障原因的数量n和故障现象的数量m。然后,读取每个故障原因出现的概率pi[i],并将其转换为小数形式。接着,读取故障原因i出现故障现象j的概率pij[i][j],同样将其转换为小数形式。

读取现在出现的故障现象数量k,然后读取这k个出现的故障现象的编号,并用位集err记录下来。

定义一个变量b来存储所有故障原因的概率总和,然后遍历所有的故障原因,对于每个故障原因i,计算其出现的概率a。这个概率a是由该故障原因出现的概率pi[i]和其引起所有出现的故障现象的概率的乘积得到的。如果故障现象j出现,那么就乘以pij[i][j],否则乘以1 - pij[i][j]。然后将a加到b中,并将故障原因的编号和概率a存入ans向量中。

最后,对ans向量进行排序,然后按照题目要求的格式输出每个故障原因及其可能的概率。


AC代码

#include <algorithm>
#include <bitset>
#include <cmath>
#include <iostream>
#include <vector>
#define AUTHOR "HEX9CF"
using namespace std;
using ll = long long;

const int N = 1e3 + 7;
const int INF = 0x3f3f3f3f;
const ll MOD = 1e9 + 7;

struct S {
	int id;
	double p;
	bool operator<(const S &b) const {
		if (p == b.p) {
			return id < b.id;
		}
		return p > b.p;
	}
};

int n, m, k;
double pi[N];
double pij[N][N];
vector<S> ans;
bitset<N> err;

int main() {
	scanf("%d %d", &n, &m);
	for (int i = 1; i <= n; i++) {
		scanf("%lf", &(pi[i]));
		pi[i] *= 0.01;
	}
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			scanf("%lf", &(pij[i][j]));
			pij[i][j] *= 0.01;
		}
	}
	scanf("%d", &k);
	err.reset();
	for (int i = 1; i <= k; i++) {
		int e;
		scanf("%d", &e);
		err[e] = 1;
	}
	// cout << err.count() << endl;

	double b = 0;
	for (int i = 1; i <= n; i++) {
		double a = 1;
		for (int j = 1; j <= m; j++) {
			if (err[j]) {
                // 存在现象
				a *= pij[i][j];
			} else {
                // 现象不存在
				a *= 1 - pij[i][j];
			}
		}
		a *= pi[i];
		b += a;
		ans.push_back({i, a});
		// cout << i << " " << a << endl;
	}

	// cout << b << endl;
	sort(ans.begin(), ans.end());
	for (const auto i : ans) {
		printf("%d %.2lf\n", i.id, i.p / b * 100);
	}
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1585271.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python学习从0到1 day25 第二阶段 SQL ② Python操作数据库

少年有梦&#xff0c;不应至于心动&#xff0c;更要付诸行动 —— 24.4.11 pymysql 除了使用图形化工具以外&#xff0c;我们也可以使用编程语言来执行SQL从而操作数据库 在Python中&#xff0c;使用第三方库&#xff1a;pymysql来完成对MySQl数据库的操作 安装 pip install py…

微信小程序视频下载工具

推荐您使用"下载高手"微信小程序视频下载工具&#xff0c;它利用占领系统代理&#xff0c;抓取小程序的请求&#xff0c;并集成了下载功能&#xff0c;让您轻松获取所需视频资源。 首先下载我给大家准备好的压缩包 1.首先先退出微信 注意:一定要右下角退出 2.然后来…

Element-UI 下拉框单选转多选回显不清空绑定的值

需求 根据radio切换来更改下拉框是否多选 原因 单选和多选这两个 input 看上去没差别&#xff08;自身和层级都一致&#xff09;&#xff0c;vue出于提高性能&#xff0c;所以 vue 给复用了 解决方案 <template><section><el-radio-group v-model"radi…

【机器学习算法】决策树和随机森林在计算机视觉中的应用

前言 决策树和随机森林在计算机视觉中有着广泛的应用。决策树作为一种简单而强大的分类模型&#xff0c;可以用于图像分类、目标检测、特征提取等任务。它能够根据图像的特征逐层进行判断和分类&#xff0c;从而实现对图像数据的智能分析和理解。随机森林作为一种集成学习方法&…

基于Lipschitz李式指数的随机信号特征识别和故障检测matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 Lipschitz李式指数定义与性质 4.2 Lipschitz李式指数的估计 4.3 Lipschitz李式指数在信号特征识别与故障检测中的应用 5.完整程序 1.程序功能描述 基于Lipschitz李式指数的随机信号特…

docker基本的掌握

前言&#xff1a;先要了解docker是干什么的&#xff0c; 1掌握基本概念&#xff0c;如;镜像&#xff0c;容器&#xff0c;数据卷 2知道使用常用命令 简易图; 补充&#xff1a; 默认情况下&#xff0c;每次重启虚拟机我们都需要手动启动Docker和Docker中的容器。通过命令可以实…

【MATLAB】基于Wi-Fi指纹匹配的室内定位-仿真获取WiFi RSSI数据(附代码)

基于Wi-Fi指纹匹配的室内定位-仿真获取WiFi RSSI数据 WiFi指纹匹配是室内定位最为基础和常见的研究&#xff0c;但是WiFi指纹的采集可以称得上是labor-intensive和time-consuming。现在&#xff0c;给大家分享一下我们课题组之前在做WiFi指纹定位时的基于射线跟踪技术仿真WiFi…

解决 VSCode 编辑器点击【在集成终端中打开】出现新的弹框

1、问题描述 在 VSCode 的项目下&#xff0c;鼠标右键&#xff0c;点击【在集成终端中打开】&#xff0c;出现新的一个弹框。新版的 VSCode 会有这个问题&#xff0c;一般来说我们都希望终端是在 VSCode 的控制台中打开的&#xff0c;那么如何关闭这个弹框呢&#xff1f; 2、解…

Win10安装sqlplus遇到报错的解决办法

1.下载安装sqlplus.exe的错误解决过程 最近有用到sqlplus连接Oracle数据库执行自动化脚本&#xff0c;Orcle服务器版本是11.2.0.1。在Navicat工具上通过如下语句查询到的版本信息截图如图1所示&#xff1a; SELECT * FROM v$version; 图1 Oracle服务器版本信息 其中“Oracle Da…

台灯哪个牌子好,五大护眼灯品牌排行分享

​当前&#xff0c;我国青少年的近视率已超过半数&#xff0c;位居全球之首&#xff0c;且近视发生年龄呈现下降趋势。长时间用眼和过度使用电子产品是导致近视高发的主要因素。面对这一挑战&#xff0c;如何改善现状成为了一个亟待解决的问题。对于儿童而言&#xff0c;降低近…

【C++】模版

目录 一、泛型编程二、函数模板2.1 函数模板概念2.2 函数模板格式2.3 函数模板的原理2.4 函数模板的实例化2.5 模板参数的匹配原则 三、类模板3.1 类模板的定义格式3.2 类模板的实例化 四、非类型模板参数五、模板的特化5.1 概念5.2 函数模板特化5.3 类模板特化5.3.1 全特化5.3…

【火猫TV】欧冠:拉菲尼亚梅开二度,却在出售名单中

欧冠淘汰赛首回合&#xff0c;巴萨在客场3比2击败大巴黎&#xff0c;取得一个球的领先优势&#xff0c;双方将会在下周进行生死战。本场比赛巴萨虽然率先破门&#xff0c;却被大巴黎死死压制&#xff0c;如果不是大巴黎锋线效率一般&#xff0c;球队很可能会在客场输球。本场比…

代码随想录-算法训练营day04【链表02:两两交换链表中的节点、删除链表的倒数第N个节点、链表相交、环形链表II】

代码随想录-035期-算法训练营【博客笔记汇总表】-CSDN博客 第二章 链表part02● day 1 任务以及具体安排&#xff1a;https://docs.qq.com/doc/DUG9UR2ZUc3BjRUdY ● day 2 任务以及具体安排&#xff1a;https://docs.qq.com/doc/DUGRwWXNOVEpyaVpG ● day 3 任务以及具体安排…

华为2024年校招实习硬件-结构工程师机试题(四套)

华为2024年校招&实习硬件-结构工程师机试题&#xff08;四套&#xff09; &#xff08;共四套&#xff09;获取&#xff08;WX: didadidadidida313&#xff0c;加我备注&#xff1a;CSDN 华为硬件结构题目&#xff0c;谢绝白嫖哈&#xff09; 结构设计工程师&#xff0c;结…

1. VirtualBox安装CentOS

安装 VirtualBox 地址:https://www.virtualbox.org/wiki/Downloads 版本: 6.1和7.0+版本都可以 安装: windows上安装需要admin权限,右键菜单选中 “Run as administrator” 安装 CentOS 6.10 地址:https://vault.centos.org/6.10/isos/x86_64/ 版本: 如果不需要GUI,选择…

竹云董事长在第十二届中国电子信息博览会开幕峰会暨全国“专精特新”电子信息行业论坛作主题演讲

2024年4月9日&#xff0c;第十二届中国电子信息博览会开幕峰会&#xff08;CITE2024&#xff09;暨全国“专精特新”电子信息行业论坛在深圳会展中心盛大举行。 本届电博会开幕峰会以“追求卓越&#xff0c;数创未来”为主题&#xff0c;特邀百位专家学者、行业精英、知名投资人…

金三银四面试题(十九):MySQL中的锁

在MySQL中&#xff0c;锁是非常重要的&#xff0c;特别是在多用户并发访问数据库的环境中&#xff0c;因此也是面试中常问的话题。 请说说数据库的锁&#xff1f; 关于MySQL 的锁机制&#xff0c;可能会问很多问题&#xff0c;不过这也得看面试官在这方面的知识储备。 MySQL …

新版HI3559AV100开发注意事项(三)

新版HI3559AV100开发注意事项&#xff08;三&#xff09; 十九、用的sdk是Hi3559V200_MobileCam_SDK_V1.0.1.5 播放AAC音频文件&#xff0c;adec->ao;adec的初始化里面包括了aaclc解码器的注册&#xff0c;可是在HI_MPI_ADEC_RegisterDecoder(&s32Handle, &stAac);…

43-技术演进(上):虚拟化技术演进之路

在Kubernetes集群中部署IAM应用&#xff0c;会涉及到一些重要的云原生技术&#xff0c;例如Docker、Kubernetes、微服务等。另外&#xff0c;云原生架构中还包含了很多其他的技术 因为这一讲涉及的技术栈很多&#xff0c;所以我会把重点放在演进过程上&#xff0c;不会详细介…

面试算法-171-翻转二叉树

题目 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1] 解 class Solution {public TreeNode invertTree(TreeNode root) {if (root n…