1 条题解
-
0
题目题解
问题理解
机器人从 出发,每次可以选择 ,移动到 。
使用新的 成本为 ,重复使用成本为 。
求到达 的最小总成本。
第一步:平凡上界
总是可以使用操作 重复 次,以及操作 重复 次。
这两组操作各首次使用时成本 ,后续重复成本 。
因此总成本 。所以答案只可能是 或 。
第二步:何时成本为 ?
成本为 意味着只使用一种 对,重复若干次(可能一次)。
设使用 次操作,则:因此 必须是 和 的公因数,且:
$$dx = \frac{a}{t} \le k, \quad dy = \frac{b}{t} \le k. $$要存在这样的 ,等价于存在一个公因数 使得 且 。
第三步:最大化
条件等价于:
$$t \ge \frac{a}{k} \quad \text{且} \quad t \ge \frac{b}{k}. $$因此 至少为 $\max\left(\left\lceil \frac{a}{k} \right\rceil, \left\lceil \frac{b}{k} \right\rceil\right)$。
同时 必须是 和 的公因数。显然,选择最大的可能 (即 )最有可能满足条件。
因为若存在某个 满足条件,则 是 的倍数, 也成立。
所以只需检查 即可。
第四步:判断条件
计算 。
$$\frac{a}{g} \le k \quad \text{且} \quad \frac{b}{g} \le k, $$
若则可以用 重复 次,成本为 。
否则成本为 。
第五步:时间复杂度
- 计算 :。
- 总复杂度 ,满足 ,。
代码实现
#include <bits/stdc++.h> using namespace std; using ll = long long; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int t; cin >> t; while (t--) { ll a, b, k; cin >> a >> b >> k; // 使用 __gcd 或 std::gcd ll g = __gcd(a, b); // GCC 内置函数,兼容性好 // 或者使用 std::gcd 需要 C++17 和 <numeric> // ll g = gcd(a, b); if (a / g <= k && b / g <= k) { cout << "1\n"; } else { cout << "2\n"; } } return 0; }
验证样例
输入:
4 3 5 15 2 3 1 12 18 8 9 7 5输出:
1 2 1 2与题目输出一致。
总结
本题的关键在于:
- 观察到答案不超过 。
- 成本为 当且仅当 对应的操作步长不超过 。
- 只需检查 即可,无需枚举所有公因数。
- 1
信息
- ID
- 6292
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 2
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者