题解:P12356 「HCOI-R2」Rabbit Panic (Hard Ver.)
题解:「HCOI-R2」Rabbit Panic (Hard Ver.)
再看之前求关(是我的的一篇题解,请求鼓励)
话说回来,这道题我也是看了别的老师的题解才打的,有错误私信
一、问题分析 题目要求将初始排列 {1,2,…,n}通过最少次数的操作变为所有元素相等。每次操作可选择m个不同位置,将它们的值同时改为它们的平均值。
-
最终状态:所有元素必须等于初始总和的平均值,即 2分之n+1(因初始总和为2分之n(n+1))。
-
操作特性:每次操作不改变所选 m个元素的总和(平均值替换后总和不变),因此整体总和始终守恒,这是可行的前提(但不保证一定有解)。
二、关键结论
- 无解条件:当且仅当以下情况之一成立时无解:
- m=1且 n≠1 (单次操作无法改变元素值)。
- n mod m = 0且 m≠n(无法通过两次操作覆盖所有元素并平衡值)。
- n mod(n−m) = 0且n − m ≠ 0(同理,两次操作无法平衡)。
- 最小操作数:
- 若 m=n,只需 1 次操作(全选所有元素)。
- 若 n=1,无需操作(0 次)。
- 其他有解情况,最小操作数为
三、构造方案
-
特殊情况处理
- n=1:输出 0(已满足所有元素相等)。
- m=n:输出 1 次操作,选择所有位置 {1,2,…,n}。
-
两次操作的构造(有解时)
核心思想:通过两次重叠的操作覆盖所有 n 个元素,确保每个元素最终值为 2分之n+1。
- 第一次操作:选择前 k个元素和后 m−k个元素,其中 k=2m−n (保证两次操作覆盖所有元素)。
- 第二次操作:选择中间 m个元素,与第一次操作重叠 k 个元素。
示例(如输入 n=6,m=4):
- 第一次操作:{1,2,5,6}(前 2 个 + 后 2 个,k=2)。
- 第二次操作:{2,3,4,5} (中间 4 个,与第一次重叠 2个)。
- 效果:两次操作覆盖所有 6 个元素,最终均变为 3.5。
四、代码实现
//你在想啥?代码怎么可能这么简单的给你
//你还是看别人的吧,我只会思路,代码.......