Files
python/TangDou/Mkx/20241103/4_2.cpp
HuangHai 1f397eca87 'commit'
2025-08-30 18:35:01 +08:00

47 lines
1.4 KiB
C++

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 50010;
/*
8
4 -1 5 -2 -1 2 6 -2
*/
struct Node {
LL sum; // LL
int id;
} s[N];
int n;
bool cmp(Node a, Node b) {
if (a.sum != b.sum) return a.sum < b.sum;
return a.id < b.id;
}
int main() {
// 配置从文本文件读入数据
freopen("4.in", "r", stdin);
scanf("%d", &n);
LL x;
LL ans = 0x3f3f3f3f; // 答案
for (int i = 1; i <= n; i++) {
scanf("%lld", &x);
s[i].sum = s[i - 1].sum + x; // 前缀和
s[i].id = i; // 序号
if (x > 0) ans = min(ans, x); // 每个输入数字,只取它自己,也可能成为答案
if (s[i].sum > 0) ans = min(s[i].sum, ans); // 每个输入数字,从头取到它自己,也可能成为答案
}
// 按前缀和由小到大排序
sort(s + 1, s + 1 + n, cmp);
/*
性质:最小的差距一定出现在相邻的两项中。
证明: 在排序后的连续 3 项中 a,b,c 中,
假设 a,c 是差距最小的,那么 a,b 或者 b,c一定可以组成一种更优的一组解。
*/
for (int i = 1; i < n; i++)
if (s[i].id < s[i + 1].id && s[i + 1].sum - s[i].sum > 0 && s[i + 1].sum - s[i].sum < ans)
ans = s[i + 1].sum - s[i].sum; // 更新m
// 输出答案
cout << "ans=" << ans << endl;
return 0;
}