1 条题解
-
0
A. New World, New Me, New Array 详细题解
一、题目理解
初始有一个长度为 的全零数组 。每次操作可以选择一个位置 ,将其值改为任意整数 ,满足 。目标是通过若干次操作,使数组所有元素之和等于 。求最少操作次数,若不可能则输出 。
二、核心观察
1. 可达和的范围
每次操作可以将某个位置从 改为 内的任意整数。因此:
- 单次操作可以改变数组和的值最多
- 所有 个位置都操作一次后,数组和的取值范围是
重要结论:数组和可达到的范围是 ,且范围内的每个整数都可以达到(因为每次可以调整 ,通过选择合适的 )。
2. 最少操作次数
设最终数组的和为 ,初始和为 。
每次操作最多能改变数组和 (正方向)或 (负方向)。
为了用最少次数达到 ,显然应每次尽可能多地向目标靠近:
- 若 :不需要任何操作,答案为
- 若 :每次操作最多增加 ,因此至少需要 次
- 若 :每次操作最多减少 ,因此至少需要 次
统一公式:
$$\text{最少次数} = \left\lceil \frac{|k|}{p} \right\rceil $$3. 边界检查
如果 ,则即使把所有位置都改成极限值(),也无法达到 ,此时无解输出 。
三、算法步骤
- 读入
- 如果 :输出
- 否则,输出
四、公式推导
$$\left\lceil \frac{|k|}{p} \right\rceil = \frac{|k| + p - 1}{p} \quad \text{(整数除法)} $$标程中的代码:
cout << (abs(k) + p - 1) / p << '\n';正是这个公式的整数除法实现。
五、复杂度分析
- 每个测试用例
- 总复杂度 ,满足
六、总结
要点 说明 核心公式 $\lceil 可行范围 内所有整数 贪心策略 每次用最大步长 向目标靠近 时间复杂度 每个测试用例 特殊处理 时答案为 (公式自动给出)
- 1
信息
- ID
- 7239
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 5
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者