1 条题解
-
0
思路与算法
初始工兵及增援形成带符号气势和,枚举第二次增援营地使绝对差最小;128位中间和避免10^5与10^9联合范围溢出,同差保留小编号。
按上述模型建立状态或枚举对象,依代码中的顺序处理输入并输出完整答案。
正确性说明
以龙减虎的有符号气势Z表示状态,新兵在i营的贡献是s2(m-i)。穷举所有营地使其绝对值最小覆盖所有合法决策,升序严格改善更新实现最小编号。
复杂度
O(n)时间、O(n)存储工兵,初始化和气势累加均线性。
易错点
总气势可超过有符号64位,用128位累加与比较;增援落在分界营贡献为0。
参考代码(C++11)
#include <bits/stdc++.h> using namespace std; int main() { int n; cin >> n; vector<long long> a(n + 1); for (int i = 1; i <= n; i++) cin >> a[i]; int m, p; long long s, t; cin >> m >> p >> s >> t; a[p] += s; __int128 z = 0; for (int i = 1; i <= n; i++) z += (__int128)a[i] * (m - i); __int128 best = -1; int ans = 1; for (int i = 1; i <= n; i++) { __int128 v = z + (__int128)t * (m - i); if (v < 0) v = -v; if (best < 0 || v < best) { best = v; ans = i; } } cout << ans << "\n"; }
- 1