Skip to content

清华大学 2021 年九推机试

1、售货机

时间限制: 1.0 秒

空间限制: 512 MiB

题目描述

清华大学的自动售货机一共有 𝑛 种饮料出售,每种饮料有自己的售价,并在售货机上各有一个出售口。购买第 𝑖 种饮料时,可以在第 𝑖 个出售口支付 𝑎𝑖 的价格,售货机便会在下方的出货处放出对应的饮料。

又到了清凉的夏日,自动售货机为每种饮料各进货了1 瓶存储在其中,供同学购买。但是,自动售货机却出现了一些故障,它有可能会出货不属于这个出售口的饮料。

对于第 𝑖 个出售口,支付 𝑎𝑖 的价格购买后,如果饮料 𝑖 与饮料 𝑏𝑖 都有存货,有 𝑝𝑖 的概率出货饮料 𝑖 ,有 1−𝑝𝑖 的概率出货饮料 𝑏𝑖 。如果其中一个有存货,另一个已经没有存货,则将出货有存货的那一种饮料。如果两种饮料都没有存货,售货机将不会出货任何饮料并发出警报。**即便最后你没有获得任何饮料,也需要支付 𝑎𝑖 的价格 ** 。

长颈鹿下楼来到这台售货机前,希望能买到最近火爆全网的饮料 𝑥 ,此时售货机中 𝑛 种饮料都存货有 1 瓶。由于他知道售货机有问题,因此决定采取这样的策略来购买:

  • 在 𝑛 个出售口中等概率选择一个出售口 𝑠 开始购买,支付这个出售口的价格 𝑎𝑠 并得到出货。
  • 当得到想要的饮料 𝑥 时,停止购买流程,满意欢喜的离去。
  • 当得到不想要的饮料 𝑦 时,继续在第 𝑦 个支付口购买,支付 𝑎𝑦 的价格并等待出货。
  • 当售货机发出警报时,停止购买流程,灰心丧气的离去。

现在他希望你告诉他,他这一次购买过程期望支付的价钱数量是多少?

输入格式

从标准输入读入数据。

第一行两个正整数 𝑛,𝑥。

接下来 𝑛 行每行三个数,其中第 𝑖 行表示 𝑎𝑖,𝑏𝑖,𝑝𝑖。

输出格式

输出到标准输出。

一行一个实数表示答案,表示长颈鹿按他的策略买水期望支付的价钱。

记答案为 𝑎,而你的输出为 𝑏,那么当且仅当 |𝑎−𝑏|<10−6 时我们认为你的输出是正确的。

样例输入

2 2
8 2 0.90
7 1 0.40

样例输出

13.500000000

样例解释

售货机里饮料 1 与饮料 2 各有一瓶,且当两瓶都还有存货时,在第 1 个出售口有 0.1 的概率买到饮料 2 ,在第 2 个出售口有 0.6 的概率买到饮料 1 。

  • 长颈鹿有0.5的概率初始选择第1个出售口开始购买,并支付8元。
  • 有 0.1 的概率直接出货饮料 2 ,一共支付 8 元,这种情况的概率是 0.05 。
  • 有 0.9 的概率出货饮料 1 ,则长颈鹿会再支付 8 元重新从第 1 个出售口购买饮料。由于饮料 1 已售空,第二次购买时必定直接出货饮料 2 ,一共支付 16 元,这种情况的概率是 0.45 。
  • 长颈鹿有0.5的概率初始选择第2个出售口开始购买,并支付7元。
  • 有 0.4 的概率直接出货饮料 2 ,一共支付 7 元,这种情况的概率是 0.2 。
  • 有 0.6 的概率出货饮料 1 ,则长颈鹿会再支付 8 元重新从第 1 个出售口购买饮料。由于饮料 1 已售空,第二次购买时必定直接出货饮料 2 ,一共支付 15 元,这种情况的概率是 0.3 。

于是期望支付的价钱为 8×0.05+16×0.45+7×0.2+15×0.3=13.5

子任务

保证 𝑛≤2000 , 1≤𝑏𝑖≤𝑛 , 𝑏𝑖≠𝑖 , 0≤𝑎𝑖≤100 ,0≤𝑝𝑖≤1 ,且 𝑝𝑖 不超过两位小数。

子任务 1(50分):𝑛≤10

子任务 2(30分):𝑝𝑖=0

子任务 3(20分):无特殊限制

2、水滴

时间限制: 2.0 秒

空间限制: 512 MiB

相关文件: 题目目录

题目描述

这是一个经典的游戏。

在一个 𝑛×𝑚 的棋盘上,每一个格子中都有一些水滴。

玩家的操作是,在一个格子中加一滴水。

当一个格子中的水滴数超过了 4,这一大滴水就会因格子承载不住而向外扩散。扩散的规则是这样的:

这个格子中的水滴会消失,然后分别向上、左、下、右 4 个方向发射一个水滴。如果水滴碰到一个有水的格子,就会进入这个格子。否则水滴会继续移动直到到达棋盘边界后消失。扩散后,水滴进入新的格子可能导致该格子的水滴数也超过 4 ,则会立即引发这个格子的扩散。我们规定,每个格子按逆时针顺序从上方向开始,递归处理完每一个方向的扩散以及其引发的连锁反应,再处理下一个方向的扩散。

给定棋盘的初始状态和玩家的操作,求最后水滴的分布情况。

由于把水滴在一个空格看起来用处不大,所以保证所有的玩家操作都不会选择空格。

提示:可以记录每个水滴上下左右方向第一个水滴的位置,扩散时根据规则模拟,并在每次操作后维护。

输入格式

从标准输入读入数据。

第一行四个整数 𝑛,𝑚,𝑐,𝑇。

接下来 𝑐 行,每行三个正整数 𝑥𝑖,𝑦𝑖,𝑎𝑖,表示初始棋盘上第 𝑥𝑖 行 𝑦𝑖 列有 𝑎𝑖 个水滴。

接下来 𝑇 行,每行两个正整数 𝑢𝑖,𝑣𝑖,表示在第 𝑢𝑖 行 𝑣𝑖 列放入一个水滴。

输出格式

输出到标准输出。

输出 𝑇 加若干行。

前 𝑇 行每行一个整数,第 𝑖 行表示在第 𝑖 次操作后扩散的水滴数。若没有扩散输出 0。

最后若干行(可能是 0 行)表示棋盘上水滴的分布情况。由上至下,由左至右输出,每行三个正整数表示行号、列号、水滴数。

样例输入

4 4 12 1
1 2 1
1 3 2
2 1 1
2 4 1
3 1 1
3 4 1
4 2 1
4 3 1
2 2 4
2 3 4
3 2 4
3 3 3
2 2

样例输出

4
1 2 3
1 3 4
2 1 3
2 4 2
3 1 3
3 4 2
4 2 2
4 3 2

样例解释

img img

整个过程从上到下从左到右表示。

字母表示该格子即将发射水滴的方向。U:上;D:下;L:左;R:右。

黄色格子表示即将发射水滴的格子。

子任务

保证 1≤𝑛,𝑚≤351493,0≤𝑐≤750000,0≤𝑇≤500000。

保证 1≤𝑥𝑖,𝑢𝑖≤𝑛,1≤𝑦𝑖,𝑣𝑖≤𝑚,1≤𝑎𝑖≤4。

保证没有重复的 (𝑥𝑖,𝑦𝑖)。

子任务 1(17分):𝑛,𝑚≤100

子任务 2(24分):𝑛,𝑚≤2000

子任务 3(24分):𝑐≤105

子任务 4(35分):无特殊性质

3、Phi的游戏

时间限制: 1.5 秒

空间限制: 512 MiB

题目描述

Picar 和 Roman 是两个非常喜欢玩各种游戏的赌徒。这一天,他们又发现了一种新的数字游戏,名叫 𝜑 的游戏(Phigames)。

𝜑 的游戏是双人游戏,每局游戏由任意的一个正整数 𝑁 开始,由两人轮流对当前的数字进行操作。轮到其中任意一方进行操作时,玩家可以有以下三种选择:

  1. 大喊“𝜑:1!”并将当前的数字 𝑛 变为 𝜑(𝑛);
  2. 大喊“𝜑:2!”并将当前的数字 𝑛 变为 𝜑(2𝑛);
  3. 大喊“𝜑:𝐾!”并将当前的数字 𝑛 变为 𝜑(𝑛−𝐾),其中 𝐾 是一个双方在开始游戏之前约定好的正整数。

其中,𝜑(𝑛) 表示的是在 1 到 𝑛 这 𝑛 个正整数中,有多少个正整数与 𝑛 互质,如 𝜑(1)=1,𝜑(4)=2,𝜑(10)=4。根据这一定义可知,𝜑(𝑛) 的定义域是 ℕ∗,所以如果选择第 3 种操作“𝜑:𝐾!”,需要保证当前的数字 𝑛>𝐾。

两名玩家轮流操作,如果谁在进行操作之后得到了已经出现过的数字,谁就输掉了本局游戏。例如,如果玩家 A 对当前的数字 1 选择了操作 1 “𝜑:1!”,由于 𝜑(1)=1 是出现过的数字,玩家 A 输掉了本局游戏,对手获胜。

𝜑 的游戏考验了玩家的心算能力和逻辑推理能力。可惜,由于 Picar 和 Roman 足够聪明,只要指定一个 𝐾 和最开始的数字 𝑁,他们就可以算出是先手还是后手有必胜策略。如果对于某个确定的 𝐾,以 𝑁 开始游戏时先手有必胜策略,则称这个 𝑁 为先手必胜态;否则后手有必胜策略,称 𝑁 为后手必胜态。为了使得这个游戏(对他们来说)更有趣,他们决定对游戏进行扩展:

  • 玩家先指定 𝐾,并选择两个正整数 𝐿,𝑅,由系统在 [𝐿,𝑅] 中的先手必胜态中随机挑选一个 𝑟 作为右端点;
  • 由后手选择一个正整数左端点 𝑙 ,需要保证 𝑙≤𝑟;
  • 开始一局游戏时,系统从 [𝑙,𝑟] 中等概率挑选一个正整数 𝑁 ,作为游戏开始时由先手操作的数字。

尽管 Picar 和 Roman 足够聪明,计算修改后的游戏对他们来说也需要花费不少的时间。于是,他们找到了你,想让你帮忙计算一下修改后的游戏的平衡性。即:给定参数 𝐿,𝑅,𝐾,求后手对于任意的 𝑟 能选出最优的 𝑙 使得后手胜率最大时,先手的平均胜率。

输入格式

从标准输入读入数据。

输入仅一行,包含三个正整数 𝐿,𝑅,𝐾,含义如题目描述所示。保证 𝐿≤𝑅,且在 [𝐿,𝑅] 中至少存在一个先手必胜态。

输出格式

输出到标准输出。

输出一个实数,表示在给定的参数 𝐿,𝑅,𝐾 下,修改后的游戏的先手平均胜率。

记答案为 𝑎,而你的输出为 𝑏,那么当且仅当 |𝑎−𝑏|<10−6 时我们认为你的输出是正确的。

样例1输入

1 10 3

样例1输出

0.533333333333333333

样例1解释

此时 2,4,5,7,9,10 为先手必胜态,1,3,6,8 为后手必胜态。

  • 𝑟=2 对应的最优左端点 𝑙 为 1,此时先手胜率为 1/2;
  • 𝑟=4 对应的最优左端点 𝑙 为 3,此时先手胜率为 1/2;
  • 𝑟=5 对应的最优左端点 𝑙 为 1,此时先手胜率为 3/5;
  • 𝑟=7 对应的最优左端点 𝑙 为 6,此时先手胜率为 1/2;
  • 𝑟=9 对应的最优左端点 𝑙 为 8,此时先手胜率为 1/2;
  • 𝑟=10 对应的最优左端点 𝑙 为 6,此时先手胜率为 3/5。

故先手的平均胜率为 (1/2+1/2+3/5+1/2+1/2+3/5)/6=8/15≈0.5333。

样例2输入

2021 5000 0

样例2输出

0.391970630667343944

样例3输入

214 7483648 57721

样例3输出

0.490802831707061571

子任务

对于 100 的数据,保证 1≤𝐿≤𝑅≤107,0≤𝐾≤107。

具体的测试点分布见下表:

测试点 𝐿,𝑅≤ 𝐾 特殊性质
1 6 <𝑅
2 10
3 16
4 18
5 1000
6 2000
7 3000
8 5000
9 105 𝑅−𝐿≤99
10 106 𝑅−𝐿≤9
11 5×106 =0
12 <𝑅
13 105
14
15
16 106 =0
17 <𝑅
18 107 𝐿=𝑅
19
20