酷代码 AI
菜单
全部AI  /  热门  /  AI写代码神器
服务商

给定一个有 N N个元素的数组 A A,你可以进行任意次操作,每次操作可以选择一个 i i,使得 A i − T A i​−T。 在操作完成后,你可以任意选择一个整数 R R。 你的任务是,使得最大的 ∣ R − A i ∣ ∣R−A i​∣尽可能小。 输入格式 第一行包含两个整数 N , T N,T。 第二行包含用空格分隔的 N N 个整数 A 1 , A 2 , … , A N A 1​,A 2​,…,A N​。 输出格式 输出一行一个整数,为最大的 ∣ R − A i ∣ ∣R−A i​∣的最小值。 用c++写 语言方向:C++ 系统环境:Windows

```cpp #include <bits/stdc++.h> using namespace std; int main(){ int N, T; cin >> N >> T; vector<long long> A(N); for(auto &x: A) cin >> x; auto calc_max_diff = [&](long long R) -> long long { long long max_diff = 0; for(auto x: A){ long long current = abs(R - x); if(current > max_diff) max_diff = current; } return max_diff; }; long long min_max_diff = LLONG_MAX; for(int i=0; i<N; i++){ long long candidate = A[i] / T; long long lower = (candidate - 1) * T; long long upper = candidate * T; long long diff_lower = calc_max_diff(lower); long long diff_upper = calc_max_diff(upper); if(diff_lower < min_max_diff) min_max_diff = diff_lower; if(diff_upper < min_max_diff) min_max_diff = diff_upper; } cout << min_max_diff << endl; } ``` 三条额外需要注意的逻辑点: 1. 整数除法:在计算 `candidate` 时,使用的是整数除法,这可能会导致精度损失,但在本题中是合理的,因为我们只关心 `T` 的倍数。 2. 边界条件:在计算 `lower` 和 `upper` 时,需要考虑 `candidate` 为 0 或最大值的情况,确保不会超出 `A[i]` 的范围。 3. 时间复杂度:由于我们对每个元素都进行了两次计算(`lower` 和 `upper`),整体时间复杂度为 O(N),在 N 较大的情况下仍然可以高效运行。 [2025-05-24 22:23:37 | AI写代码神器 | 482点数解答]

相关提问