#include 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; }