1 条题解
-
0
题意分析
本题描述了一个体育课上的随机健身运动游戏。游戏中有 N 个放置在健身房不同位置且带有独特图片的篮子,每个篮子里有一些写有目标篮子的索引卡。孩子们从指定的起始篮子开始,轮流随机抽取一张卡片,记住目的地后归还卡片,当老师吹响哨子,所有孩子移动到卡片指示的篮子。已知每个篮子里指向不同目标篮子的卡片数量,需要确定孩子们在游戏的前十步出现在每个篮子的概率。
解题思路
1、数据输入与存储 首先读取第一行数据,通过解析出篮子的数量 n。接着读取后续 n - 1 行数据,将每个篮子里指向不同目标篮子的卡片数量存储在二维数组 arr 中。 同时,计算每个篮子里卡片的总数,存储在一维数组 sum 中。
-
初始状态设置 由于孩子们总是从第一个篮子开始,所以初始时第一个篮子的概率为 1,其他篮子的概率为 0,即 pos[0][0] = 1。
-
动态规划计算概率 使用两层循环模拟游戏的前十步,外层循环控制步数 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 中卡片的总数。
-
输出结果 在每一步计算完成后,输出当前步出现在各个篮子的概率,精确到小数点后五位。
参考代码
#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
- 上传者