/*
这个题目粗看根本看不懂,大概花费了20分钟左右去分析和理解题目,题目要求的是
第一行输入的故障原因和故障现象的个数
第二行输入的是故障原因的概率 注意一定要注意此处的概率
后面”故障原因”行输入的是每一行都是”故障现象的概率”
然后接下来一行输入的出现故障现象的数量 //注意此处是已经出现的故障
最后一行则是出现的这一个故障现象编号
*/
#include<iostream>
using namespace std;
struct uu{
int n;
double qq;
};
struct uu pp[50];
int temp;
double tp;
int main()
{
int N,M,k,K[50];
double P[50],Q[50][50],q[50][50];
cin>>N>>M;
for(int i=1;i<=N;i++)
{
cin>>P[i];
}
for(int i=1;i<=N;i++)
{
for(int j=1;j<=M;j++)
{
cin>>Q[i][j];
q[i][j]=P[i]*Q[i][j];//此处得出的是真正的概率值
}
}
//求出每一列,也就是每一个故障现象的总概率
double sum[50];
sum[1]=0.00;
for(int j=1;j<=M;j++)
{
for(int i=1;i<=N;i++){
sum[j]=q[i][j]+sum[j];
}
}
cin>>k;
for(int i=1;i<=k;i++)
{
cin>>K[i];
}
double qq[50];
double SUM=0.00;
for(int j=1;j<=k;j++){
SUM=sum[K[j]]+SUM; //这里定义全部的总概率;
}
for(int i=1;i<=N;i++){
double r=0.00;
for(int j=1;j<=k;j++){
r=r+q[i][K[j]];
}
pp[i].qq = (double)(r / SUM)*100;
pp[i].n = i;
//假设到此为止已经计算出每一个的概率
}
/* //用于测试概率的正确性
for(int k=1;k<=N;k++)
{
printf("%d %.2lf\n",pp[k].n,pp[k].qq);
//cout<<pp[k].n<<" "<<pp[k].qq<<endl;
}*/
//此处进行的排序
for(int j=2;j<=N;j++)
{
for(k=1;k<=N-j;k++)//从第一个数开始,一直到倒数第二个数,比较大小
//然后是第一个数开始,一直到倒数第三个数,比较大小,依次
{
if(pp[k+1].qq>pp[k].qq)
{
temp=pp[k].n;
pp[k].n=pp[k+1].n;
pp[k+1].n=temp;
tp=pp[k].qq;
pp[k].qq=pp[k+1].qq;
pp[k+1].qq=tp;
}
else if(pp[k+1].qq==pp[k].qq)//注意进行判断的时候是两个等于号
{
if(pp[k+1].n<pp[k].n)
{
temp=pp[k].n;
pp[k].n=pp[k+1].n;
pp[k+1].n=temp;
tp=pp[k].qq;
pp[k].qq=pp[k+1].qq;
pp[k+1].qq=tp;
}
}
}
}
for(int k=1;k<=N;k++)
{
printf("%d %.2lf\n",pp[k].n,pp[k].qq);
//cout<<pp[k].n<<" "<<pp[k].qq<<endl;
}
return 0;
}
就差一步了,就是要明白题目当中的数值是怎么计算出来的,我暂时还没有理解
要看懂我进行概率计算的那一部分,如果要得到答案的正确数值,就必须要理解如何才能计算出题目要求的数值,我这边的概率是自己的方案计算.
其他的方法暂时没有问题
2022.11.16更新
此题应该采用贝叶斯公式
案例如下:
例如:一座别墅在过去的 20 年里一共发生过 2 次被盗,别墅的主人有一条狗,狗平均每周晚上叫 3 次,在盗贼入侵时狗叫的概率被估计为 0.9,问题是:在狗叫的时候发生入侵的概率是多少?
我们假设 A 事件为狗在晚上叫,B 为盗贼入侵,则以天为单位统计,P(A) = 3/7,P(B) = 2/(20*365) = 2/7300,P(A|B) = 0.9,按照公式很容易得出结果:P(B|A) = 0.9*(2/7300) / (3/7) = 0.00058
有一说一,具体的数学解法我还是没有搞懂
题目 2698: 蓝桥杯2022年第十三届决赛真题-机房
只做到输出每一个电脑的延迟
#include<iostream>
using namespace std;
int main()
{
//输入
int n,m,x[100001],y[100001],u[100001],v[100001];
int com[100001],sum[100001],s[100001];
cin>>n>>m;
for(int i=1;i<n;i++)
{
cin>>x[i]>>y[i];
}
for(int j=1;j<=m;j++)
{
cin>>u[j]>>v[j];
}
//计算出了每一台电脑的延迟
for(int k=1;k<=n;k++)
{
com[k]=k;
sum[k]=0;
for(int i=1;i<n;i++)
{
if(x[i]==com[k] || y[i]==com[k])
sum[k]++;
}
cout<<sum[k]<<endl;//用来测试延迟是否正确
}
return 0;
}