题目 2697: 蓝桥杯2022年第十三届决赛真题-故障 C++

/*
这个题目粗看根本看不懂,大概花费了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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值