1 条题解

  • 0
    @ 2025-4-8 23:05:11

    题意分析

    本题描述了一个体育课上的随机健身运动游戏。游戏中有 N 个放置在健身房不同位置且带有独特图片的篮子,每个篮子里有一些写有目标篮子的索引卡。孩子们从指定的起始篮子开始,轮流随机抽取一张卡片,记住目的地后归还卡片,当老师吹响哨子,所有孩子移动到卡片指示的篮子。已知每个篮子里指向不同目标篮子的卡片数量,需要确定孩子们在游戏的前十步出现在每个篮子的概率。

    解题思路

    1、数据输入与存储 首先读取第一行数据,通过istringstream istringstream 解析出篮子的数量 n。接着读取后续 n - 1 行数据,将每个篮子里指向不同目标篮子的卡片数量存储在二维数组 arr 中。 同时,计算每个篮子里卡片的总数,存储在一维数组 sum 中。

    1. 初始状态设置 由于孩子们总是从第一个篮子开始,所以初始时第一个篮子的概率为 1,其他篮子的概率为 0,即 pos[0][0] = 1。

    2. 动态规划计算概率 使用两层循环模拟游戏的前十步,外层循环控制步数 ii,从 1 到 9。 对于每一步,使用两层嵌套循环遍历每个篮子。根据状态转移方程 pos[ii][j] += pos[ii - 1][i] * arr[i][j] / sum[i] 计算当前步到达篮子 j 的概率。该方程表示当前步到达篮子 j 的概率等于上一步在各个篮子 i 的概率乘以从篮子 i 移动到篮子 j 的概率之和。 从篮子 i 移动到篮子 j 的概率为 arr[i][j] / sum[i],其中 arr[i][j] 是篮子 i 中指向篮子 j 的卡片数量,sum[i] 是篮子 i 中卡片的总数。

    3. 输出结果 在每一步计算完成后,输出当前步出现在各个篮子的概率,精确到小数点后五位。

    参考代码

    #include <iostream>
    #include <cstdio>
    #include <string>
    #include <algorithm>
    #include <sstream>
    //#include <cstring>
    using namespace std;
    typedef long long ll;
    int arr[50][50];
    double pos[50][50],sum[50];
    string str;
    int main(){
        getline(cin,str);
        int n=0;
        istringstream sin(str);
        while(sin>>arr[0][n++]);
        --n;
        for(int i=1;i<n;i++){
            for(int j=0;j<n;j++){
                cin>>arr[i][j];
            }
        }
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                sum[i]+=arr[i][j];
            }
        }
        pos[0][0]=1;
        for(int i=0;i<n;i++){
            printf("%.5f%c",pos[0][i],i==n-1?'\n':' ');
        }
        for(int ii=1;ii<10;ii++){
            for(int i=0;i<n;i++){
                for(int j=0;j<n;j++){
                    pos[ii][j]+=pos[ii-1][i]*arr[i][j]/sum[i];
                }
            }
            for(int i=0;i<n;i++) printf("%.5f%c",pos[ii][i],i==n-1?'\n':' ');
        }
    }
    
    • 1

    信息

    ID
    1322
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者