2025_4_6 省赛集训4
[toc]
A: Russian Roulette

题意翻译
在Orlando发生了我们都知道的事情之后,Sasha和Roma决定找出谁仍然是球队最大的输家。谢天谢地,Masha在某个地方发现了一把左轮手枪,它的转轮上有n个弹槽,恰好可以装k个子弹,现在男孩们有机会一劳永逸地解决这个问题。
Sasha从n个弹槽中选择任意k个,然后把子弹放在那里。Roma旋转转轮,使得转轮的n种位置都是等概率的。然后游戏开始,玩家轮流操作,Sasha先手:他把枪顶着脑袋开枪。如果扳机前没有子弹,转轮会移动一个位置,手枪也会交给Roma,让Roma做出同样的动作。游戏一直持续到有人中枪,幸存者就是赢家。
Sasha不想输,所以他必须选择子弹放置的位置,这样才能把自己输的概率降到最低。
更正式地说,能够包含k子弹的n弹槽的圆柱体可以表示为n字符的字符串。其中k个是“X”(有子弹),其他是“.”(空弹槽)。定义“.”字典序小于“X”,在所有可能的方案中,他希望选择字典序最小的一个。
现在给出p个询问,要求你回答弹槽x是否有子弹。
题解(python)
情况可分为两种
我们需要尽可能让先手赢,因此要尽量使得子弹间隔排列。
对于偶数
- 若子弹数量k*2小于蛋槽数,则排列在偶数位置,从后往前排列使得字典序最小
- 若子弹数量k*2大于蛋槽数,则偶数位置都为子弹,奇数位置从后往前枚举使得字典序最小
- 对于奇数
- 如例三,可以证明
...xx
和..x.x
先手获胜几率都为2/5,选择字典序最大的...xx
,若至少有一颗子弹,我们特判最后位置询问,然后将奇数蛋槽转化为偶数蛋槽
- 如例三,可以证明
- 特判没有子弹
1 | n,k,m = map(int,input().split()) |
B: Lucky Country (并查集+分组背包)

题意翻译
如果一个数中不包含除 4 和 7 之外的数字则是幸运数。有 n 个岛屿,通过双向道路连接。这些岛屿被分为几个地区。每个岛属于恰好一个区域,同一区域中的任何两个岛之间存在道路,不同区域的任何两个岛之间没有路径。如果一个地区的岛屿数量是一个幸运数字,则这个地区是幸运的。问最少增加几条道路能创建一个幸运地区。
超时做法
- 通过dfs()对岛屿进行连接,统计连通块的数量
- 通过dfs2()统计多个岛屿连接的所需的次数和值,更新arr数组为到达当前数字的最小值,最后输出下标为幸运数字的arr数组。
- 算法瓶颈在于dfs()耗时
1 |
|
并查集+多重背包:
- 由于岛屿连接是无向的,我们可以使用并查集维护同一区域的点
- 使用多重背包计算组合出”幸运数字”的最小操作数
1 |
|
C: Friends

题意翻译
给定一个含 5 个点与 m 条线的无向图,求是否至少有 3 个点连通或不连通。
- 如果是,输出
WIN
;否则输出FAIL
。 - 1≤m≤10,保证无重边与自环。
题解(python)
若全为度数为2的点,则输出FAIL
条件一:认识三对
条件二:三对不认识
度数为 3:假设顶点 A 的度数为 3,即 A 与 B、C、D 相连。那么:
如果 B、C、D 中有任意两个相连,则 A、B、C 或 A、B、D 或 A、C、D 形成一个三角形(三个互相认识的人)。
如果 B、C、D 互不相连,则 B、C、D 形成一个独立集(三个互相不认识的人)。
度数为 4:顶点 A 与四个其他顶点相连,剩下的一个顶点不与 A 相连。那么:
- 四个相连的顶点中至少有三个互相认识或互相不认识(根据鸽巢原理)。
- 如果不与 A 相连的顶点与其他顶点的连接情况也可能形成独立集。
所有度数为 2 的情况:
五个顶点,每个顶点度数为 2,意味着图中形成一个五边形(每个顶点与两个相邻顶点相连)。
在这种情况下:
- 无法找到三个互相认识的顶点(因为任何三个顶点中至少有一对不相连)。
- 也无法找到三个互相不认识的顶点(因为任何三个顶点中至少有一对相连)。
1 |
|
E: Vasya’s Function

不会
F: Text Volume

题意翻译
您将得到一个由单个空格分隔的单词组成的文本,其中包含小写字母和大写字母。计算单词中最多有多少个大写字母。
题解(python)
1 | n = int(input()) |
G: Unimodal Array

题意
- 判断一个数组是否符合”先严格递增,然后平稳(相等),最后严格递减”的模式
- 一个数组也可以恒为常数
题解(python)
1 | n = int(input()) |
H:Okabe and Banana Trees

题意翻译
在整数坐标点 (x, y) 上(x ≥ 0, y ≥ 0),每个点有一棵香蕉树,树上的香蕉数量为 x + y。Okabe 画了一条直线,方程为 y = -m * x + b(其中 m 和 b 是给定的正整数)。他可以选择一个与坐标轴对齐的矩形(可以是退化的,如线段或点),该矩形包含或位于直线下方。切割该矩形内或边界上的所有树,并获得这些树上的香蕉。
题解(cpp)
对于每个矩形(0,x)(0,y):
- 取sumx =
i * (i + 1) / 2
为x方向上的总和,总共乘y+1次 - y同理
1 |
|
J : Dynamic Problem Scoring


题解(cpp)
超级大模拟
1 |
|