47 lines
1.4 KiB
C++
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;
|
|
}
|