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

[蓝桥杯 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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

bugku-web-你从哪里来

这里就这一句话提示&#xff0c;问我是不是谷歌的&#xff1f; 用谷歌浏览器访问 没看见什么变化 抓包查看 没有变化 这时我想到爬虫中的反爬策略中有一种&#xff0c;判断请求的当前界面来判断用户的起始判断位置 这时抓取报文 GET / HTTP/1.1 Host: 114.67.175.224:1516…

Ollama教程——兼容OpenAI API:高效利用兼容OpenAI的API进行AI项目开发

相关文章: Ollama教程——入门&#xff1a;开启本地大型语言模型开发之旅 Ollama教程——模型&#xff1a;如何将模型高效导入到ollama框架 Ollama教程——兼容OpenAI API&#xff1a;高效利用兼容OpenAI的API进行AI项目开发 Ollama教程——兼容OpenAI API&#xff1a;高效利用…

阿里云服务器项目部署docker-compose+vue+redis+nginx+minio+springboot

1 阿里云服务器项目部署-单机部署 docker-compose 1.1 搭建背景 服务器 阿里云服务器 前端 vue 后端 springboot 服务 redis 、nginx、minio 都做单机模式部署,不做集群部署 博客内容参考了其他博文&#xff0c;会贴出来 1.2 <重要>端口开放前提说明 任何开放的端…

(3)(3.1) 英特尔Realsense深度摄像头(三)

文章目录 前言 10 系统概述 11 手动设置配套计算机 前言 本文介绍如何将英特尔 Realsense 深度摄像头(Intel Realsense Depth Camera)与 ArduPilot 配合使用&#xff0c;以实现避障(obstacle avoidance)。该方法使用在配套计算机上运行的 Python 脚本&#xff08;非 ROS&am…

【算法】模拟

个人主页 &#xff1a; zxctscl 如有转载请先通知 题目 前言1. 1576. 替换所有的问号1.1 分析1.2 代码 2. 495. 提莫攻击2.1 分析2.2 代码 3. 6. Z 字形变换3.1 分析3.2 代码 4. 38. 外观数列4.1 分析4.2 代码 5. 1419. 数青蛙5.1 分析5.2 代码 前言 模拟算法就是根据题目所给…

怎么开发一个预约小程序_一键预约新体验

预约小程序&#xff0c;让生活更便捷——轻松掌握未来&#xff0c;一键预约新体验 在快节奏的现代生活中&#xff0c;我们总是在不断地奔波&#xff0c;为了工作、为了生活&#xff0c;不停地忙碌着。然而&#xff0c;在这繁忙的生活中&#xff0c;我们是否曾想过如何更加高效…

【力扣】101. 对称二叉树

101. 对称二叉树 题目描述 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true 示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false 提示…

什么是云原生

什么是云原生 云原生的定义 aws&#xff1a; 云原生是在云计算环境中构建、部署和管理现代应用程序的软件方法。现代公司希望构建高度可伸缩、灵活和有弹性的应用程序&#xff0c;以便能够快速更新以满足客户需求。为此&#xff0c;他们使用了支持云基础设施上应用程序开发的现…

基于YOLOv9的道路缺陷检测,加入DCNv4、自适应阈值焦点损失提升检测精度

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文内容&#xff1a;针对基于YOLOv9的道路缺陷检测进行性能提升&#xff0c;加入各个创新点做验证性试验。 DCNv4结合SPPELAN&#xff1a;mAP从原始的0.923 提升至0.935 自适应阈值焦点损失&#xff1a; mAP从原始的0.923 提升至0.93…

Mysql视图与事物与字符集实验

一 视图 1.视图的定义 视图是一个虚拟表&#xff0c;其内容由查询定义。 2.视图的优点 1&#xff09;视点集中 2&#xff09;简化操作 3&#xff09;定制数据 4&#xff09;分隔合并数据 5&#xff09;安全性好 3.语法格式及限定条件 1&#xff09;语法格式&#xff1…

基于java+springboot+vue实现的兴顺物流管理系统(文末源码+Lw)23-287

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;货运信息因为其管理内容繁杂&#xff0c;管理数量繁多导致手工进行处理不能满足广…

【域适应】深度域适应常用的距离度量函数实现

关于 深度域适应中&#xff0c;有一类方法是实现目标域和源域的特征对齐&#xff0c;特征对齐的衡量函数主要包括MMD&#xff0c;MK-MMD&#xff0c;A-distance&#xff0c;CORAL loss&#xff0c; Wasserstein distance等等。本文总结了常用的特征变换对齐的函数定义。 工具 …

Vue3学习04 组件通信

Vue3学习04 组件通信 组件通信props 父 ↔ 子自定义事件 子 > 父mitt 任意组件间通信v-model 父↔子$attrs 祖↔孙$refs、$parent案例的完整代码ref注意点 provide、inject 祖↔孙piniaslot① 默认插槽② 具名插槽③ 作用域插槽 组件通信 Vue3组件通信和Vue2的区别&#xf…

LangChain的RAG实践

1. 什么是RAG RAG的概念最先在2020年由Facebook的研究人员在论文《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》中提出来。在这篇论文中他们提出了两种记忆类型&#xff1a; 基于预训练模型&#xff08;当时LLM的概念不像现在这么如日中天&#xff0…

CV每日论文--2024.4.11

1、InternLM-XComposer2-4KHD: A Pioneering Large Vision-Language Model Handling Resolutions from 336 Pixels to 4K HD 中文标题&#xff1a;InternLM-XComposer2-4KHD&#xff1a;开创性的大型视觉语言模型&#xff0c;可处理从 336 像素到 4K 高清的分辨率 简介&#x…

OJ 变长编码 【C】

又是跌跌撞撞完成的一道题&#xff0c;我对于位运算和进制转化这块知识点太欠缺了&#xff0c;写了这么久c的题目也没用过几次 知识点 1.取出低七位bit 使用&位运算符 与0x7F可以取出当前数的二进制最低七位&#xff0c;这里即使是整数参与运算&#xff0c;也会自动被转换…

社交革命的引领者:探索Facebook的创新策略

1. 引言&#xff1a;社交媒体的崛起 社交媒体的兴起标志着信息时代的到来&#xff0c;它不仅改变了人们的生活方式&#xff0c;也影响着整个社会结构。作为社交媒体的先驱者&#xff0c;Facebook以其创新的策略和领先的技术&#xff0c;成为了这场社交革命的引领者。从2004年马…

Shenandoah GC算法

概述 最早由Red Hat公司发起&#xff0c;目标是利用现代多核CPU的优势&#xff0c;减少大堆内存在GC时产生的停顿时间。随OpenJDK 12一起发布&#xff0c;暂停时间不依赖于堆的大小&#xff1b;这意味着无论堆的大小如何&#xff0c;暂停时间都是差不多的。 Shenandoah最初的…

[C++][算法基础]图中点的层次(树图BFS)

给定一个 n 个点 m 条边的有向图&#xff0c;图中可能存在重边和自环。 所有边的长度都是 1&#xff0c;点的编号为 1∼n。 请你求出 1 号点到 n 号点的最短距离&#xff0c;如果从 1 号点无法走到 n 号点&#xff0c;输出 −1。 输入格式 第一行包含两个整数 n 和 m。 接…

【MCU开发规范】:MCU的性能测试

MCU的性能测试 前序性能评判方法MIPSCoreMark EEMBC其他参考 前序 我们平时做MCU开发时&#xff0c;前期硬件选型&#xff08;选那颗MCU&#xff09;基本由硬件工程师和架构决定&#xff0c;到软件开发时只是被动的开发一些具体功能&#xff0c;因此很少参与MCU的选型。 大部分…