noi99钉子和小球 解题报告
题目叙述
钉子和小球
题目描述
有一个三角形木板,竖直立放,上面钉着n(n + 1) / 2颗钉子,还有(n + 1)个格子(当n = 5时如图1)。每颗钉子和周围的钉子的距离都等于d,每个格子的宽度也都等于d,且除了最左端和最右端的格子外每个格子都正对着最下面一排钉子的间隙。 让一个直径略小于d的小球中心正对着最上面的钉子在板上自由滚落,小球每碰到一个钉子都可能落向左边或右边(概率各1/2),且球的中心还会正对着下一颗将要碰上的钉子。例如图2就是小球一条可能的路径。 我们知道小球落在第i个格子中的概率pi=,其中i为格子的编号,从左至右依次为0, 1, ..., n。现在的问题是计算拔掉某些钉子后,小球落在编号为m的格子中的概率pm。假定最下面一排钉子不会被拔掉。例如图3是某些钉子被拔掉后小球一条可能的路径。
输入描述
第1行为整数n(2 ≤ n ≤ 50)和m(0 ≤ m ≤ n)。以下n行依次为木板上从上至下n行钉子的信息,每行中'*'表示钉子还在,'.'表示钉子被拔去,注意在这n行中空格符可能出现在任何位置。
输出描述
仅一行,是一个既约分数(0写成0/1),为小球落在编号为m的格子中的概率pm。既约分数的定义:A/B是既约分数,当且仅当A, B为正整数且A和B没有大于1的公因子。
样例输入 5 2** .* * ** . * * * * * * * 样例输出 7/16 |
这题真的做的人吐血.....本来DP已经写的够小心了,还要弄个高精才过的了...唉呀,不管了
只要注意细节,就可以通过.....
1.题目给出的是钉子的位置,但是我们要用到的空格,切每次球通过的路径是钉子间的空隙,所以要相应的处理下。本人采用的是map[i,j]储存的是(i,j)位置钉子的情况,f[i-1,j]储存的是钉子(i,j)的通过的球的情况。
2.动态方程如下:
f[i+1,j]:=f[i,j]+f[i+1,j];f[i+1,j+1]:=f[i,j]+f[i+1,j+1]; (if map[i,j]='*')
f[i+2,j+1]:=f[i,j]*4+f[i+2,j+1];(if map[i,j]='.')
3.记得加高精!
代码如下:
2 type
3 arra=record
4 da:array[0..30]of longint;
5 l:longint;
6 end;
7 var i,j,n,m,q:longint;
8 map:array[0..50,0..50]of char;
9 f:array[0..60,0..60]of arra;
10 ch:char;
11 fm,t,z:arra;
12 function add(a,b:arra):arra;
13 var
14 c:arra;i:longint;
15 begin
16 fillchar(c,sizeof(c),0);
17 if a.l>b.l then c.l:=a.l else c.l:=b.l;
18 for i:=1 to c.l do
19 begin
20 c.da[i]:=c.da[i]+a.da[i]+b.da[i];
21 if c.da[i]>=acc then
22 begin
23 inc(c.da[i+1]);
24 c.da[i]:=c.da[i] mod acc;
25 end;
26 end;
27 if c.da[c.l+1]>0 then inc(c.l);
28 add:=c;
29 end;
30 procedure mult2(var a:arra);
31 var i,k:longint;b:arra;
32 begin
33 k:=0;
34 fillchar(b,sizeof(b),0);
35 b.l:=a.l;
36 for i:=1 to a.l do
37 begin
38 b.da[i]:=b.da[i]+a.da[i]*2;
39 if b.da[i]>=acc then
40 begin
41 b.da[i]:=b.da[i] mod acc;
42 inc(b.da[i+1]);
43 end;
44 end;
45 if b.da[b.l+1]<>0 then inc(b.l);
46 a:=b;
47 end;
48 procedure divid2(var a:arra);
49 var i,k,t:longint;b:arra;
50 begin
51 k:=0;
52 fillchar(b,sizeof(b),0);
53 b.l:=a.l;
54 for i:= a.l downto 1 do
55 begin
56 k:=k*acc+a.da[i];
57 if k>=2 then
58 begin
59 t:=k shr 1;
60 b.da[i]:=t;
61 k:=k-(t shl 1);
62 end;
63 end;
64 a:=b;
65 while (a.da[a.l]=0)and(a.l>1) do dec(a.l);
66 end;
67 procedure print(a:arra);
68 var i:longint;s:string;
69 begin
70 write(a.da[a.l]);
71 for i:=a.l-1 downto 1 do
72 begin
73 str(a.da[i]+acc,s);
74 delete(s,1,1);
75 write(s);
76 end;
77 end;
78 begin
79
80 readln(n,m);
81 fillchar(f,sizeof(f),0);
82 f[0,1].da[1]:=1;f[0,1].l:=1;
83 for i:=1 to n do
84 begin
85 for j:=1 to i do
86 begin
87 read(ch);
88 while (ch<>'*')and(ch<>'.') do read(ch);
89 map[i,j]:=ch;
90 end;
91 readln;
92 end;
93 for i:=0 to n-1 do
94 begin
95 for j:=1 to i+1 do
96 begin
97 if map[i+1,j]='*' then
98 begin
99 f[i+1,j]:=add(f[i,j],f[i+1,j]);
100 f[i+1,j+1]:=add(f[i,j],f[i+1,j+1]);
101 end
102 else
103 begin
104 z:=add(f[i,j],f[i,j]);
105 z:=add(z,z);
106 f[i+2,j+1]:=add(z,f[i+2,j+1]);
107 end;
108 end;
109 end;
110 t:=f[n,m+1];
111 if (t.l=1)and(t.da[1]=0) then writeln('0/1')
112 else
113 begin
114 q:=n;
115 while not(odd(t.da[1])) and not((t.l=0)and(t.da[1]=0)) do
116 begin
117 divid2(t);
118 dec(q);
119 end;
120 fillchar(fm,sizeof(fm),0);
121 fm.da[1]:=1;fm.l:=1;
122 for i:=1 to q do mult2(fm);
123 print(t);write('/');print(fm);writeln;
124 end;
125 end.
公告
转载于:https://www.cnblogs.com/waterfalleagle/archive/2009/11/10/1599991.html
noi99钉子和小球 解题报告相关推荐
- 解题报告(五)组合计数(ACM / OI)超高质量题解
繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...
- NJU 2020 计算机拔尖(数学)测试 解题报告
NJU 2020 计算机拔尖(数学)测试 解题报告 试题链接, 万分感谢 Fiddie 大佬提供试题!!! 因为要准备 2022 计算机拔尖所以稍微写了一下! 1 题目 假设有 2n2n2n 个实数 ...
- 快手2020校园招聘秋招笔试--算法C试卷 练习 解题报告 Apare_xzc
快手2020校园招聘秋招笔试–算法C试卷 解题报告 Apare_xzc 2020/4/10 网页链接:牛客链接 题型分布: 选择题(2分/道*20道) 编程题(15分/道*4道) 选择 ...
- 2022.2.18解题报告
2022.2.18解题报告 T1.切蛋糕 题目描述: 思路: 首先,我们先来看一下最少用几刀就可以解决所有情况. 对于一个蛋糕,要分成至少三块,那么最少都要2刀,因为0刀或1刀分出的蛋糕数量都小于3. ...
- uscao 线段树成段更新操作及Lazy思想(POJ3468解题报告)
线段树成段更新操作及Lazy思想(POJ3468解题报告) 标签: treequerybuildn2cstruct 2011-11-03 20:37 5756人阅读 评论(0) 收藏 举报 分类: ...
- 解题报告(十八)数论题目泛做(Codeforces 难度:2000 ~ 3000 + )
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...
- 【解题报告系列】超高质量题单 + 题解(ACM / OI)超高质量题解
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我新写的超高质量的题解和代码,题目难度不 ...
- 解题报告(三)多项式求值与插值(拉格朗日插值)(ACM / OI)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...
- 解题报告(十三)中国剩余定理(ACM / OI)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...
最新文章
- java gson使用_Java 中 Gson的使用
- 【企业管理】正确评价价值-概述
- 不同php怎么传递参数,php – 将所有参数传递给另一个函数
- 第五章 数组、矩阵与广义表
- 进程间的通信——无名管道
- mysql自增字段_MySQL自增字段的常用语句
- How to Plan My Life?
- 19.9. MySQL Router
- 一篇文章教你学会实现模糊搜索结果的关键词高亮显示
- Tuxedo中间件调研
- 宝塔linux面板安全吗,宝塔面板 安全吗
- OSS对象存储是什么?
- 双基因突变患者_宁夏发现世界首例双基因突变病例 患者矮小
- 基于文件操作的学生信息管理系统(含登录验证)
- 阿里云服务器没有公网IP
- window 下DOS命令
- SpringBoot:三十五道SpringBoot面试题及答案!
- Translatium for Mac(Google在线翻译工具)的使用说明
- 资源管理器中双击文件夹会在新窗口打开
- matlab打开mp4视频时报错,关于MATLAB提取MP4视频帧时候,跨帧取速度会慢
热门文章
- 合作模式歌利亚机器人_智能时代挑战下的机器人教育新方向!
- centos 7 mysql tar安装_linux centos7 下源码 tar 安装 mysql5.7.24 图文详解
- python操作mongodb语法_python 操作MongoDB
- java定时器偶尔重复推送_在Java中创建重复的定时器提醒
- Attempt to execute SCRIPT plot as a function?
- 2022.3.25黄花酢浆草
- java做条形图_使用Jfree实现吧条形图,java代码
- 两种解法-树形dp+二分+单调队列(或RMQ)-hdu-4123-Bob’s Race
- 使用LiveNVR实现将RTSP转RTMP、FLV、HLS,实现监控摄像头无插件直播
- Appium Desktop介绍-xcodebuild failed with code 65 问题解决