1 条题解
-
0
📝 题目大意
给定三个整数 ,每次操作可以选择任意一个元素加 。求最少操作次数,使得三者构成等差数列,即 。
💡 解题思路
-
题目分析:数据范围 ,需要开
long long。只能增加元素,不能减少,这意味着我们只能通过"向上调整"来让两个差值相等。 -
算法推导: 令 ,。目标:使 。
分析三种操作对差值的影响:
- 对 加 : 减少 , 不变。
- 对 加 : 增加 , 减少 (一箭双雕)。
- 对 加 : 增加 , 不变。
核心策略分三步:
- 第一步(缩小差距):若 ,反复操作 可以同时让 增加、 减少,每次操作代价 却能让差距 缩小 。因此最多可以做 次,此时若差距为偶数则已平衡,若为奇数则 。
- 第二步(奇数修正):若差距为奇数,再做一次 操作, 和 的大小关系互换,变为 (即 )。
- 第三步(单向追赶):此时 。若 ,只能通过操作 (让 减少)或 (让 增加)来消除剩余差距,每次操作代价 、差距减少 ,共需 次。
等价地,设 为操作 的次数, 为操作 的次数,可推导出总操作次数 。由于 固定,只需最小化 ,约束为 (当 时),否则 。代入即可得到与上述三步一致的闭式解。
-
边界与细节:
- 差值可能为负数(如 ),代码中变量
a、b存储的就是 、,直接参与运算,无需特殊处理。 - 最终答案可能达到 级别,必须使用
long long(64 位整数)。 - 当 时,答案直接为 ,三步策略均不触发,
max(a-b, 0)返回 。
- 差值可能为负数(如 ),代码中变量
⏱️ 复杂度分析
- 时间复杂度:,仅涉及常数次算术运算和条件判断。
- 空间复杂度:,只使用了几个
long long变量,无额外数组或递归。
💻 标准代码 (C++)
#include<bits/stdc++.h> using namespace std; int main(){ long long a, b, c, ans = 0; // a,b,c 对应 A1,A2,A3,ans 为答案 cin >> a >> b >> c; a = b - a; // a 变为 d1 = A2 - A1 b = c - b; // b 变为 d2 = A3 - A2 if (b > a) { // 若 d2 > d1 long long d = (b - a) / 2;// 计算可做的 A2++ 次数(整数除法向下取整) ans += d; // 累加操作次数 a += d; // d1 增加 d b -= d; // d2 减少 d } if (b > a) { // 差距为奇数,仍差 1 b--; // 再做一次 A2++:d2 减 1 a++; // d1 加 1 ans++; // 操作次数 +1 } ans += max(a - b, 0ll); // 若 d1 > d2,通过 A1++ 或 A3++ 补齐差距 cout << ans << endl; } -
- 1
信息
- ID
- 866
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者