问题描述
小明是学校里的一名老师,他带的班级共有 n 名同学,第 i 名同学力量值为 ai。在闲暇之余,小明决定在班级里组织一场拔河比赛。
为了保证比赛的双方实力尽可能相近,需要在这 n 名同学中挑选出两个队伍,队伍内的同学编号连续:{al1,al1+1,…,ar1−1,ar1} 和 {al2,al2+1,…,ar2−1,ar2},其中l1≤r1<l2≤r2。
两个队伍的人数不必相同,但是需要让队伍内的同学们的力量值之和尽可能相近。请计算出力量值之和差距最小的挑选队伍的方式。
输入格式
输入共两行。
第一行为一个正整数 n。
第二行为 n 个正整数 ai。
输出格式
输出共一行,一个非负整数,表示两个队伍力量值之和的最小差距。
样例输入
5
10 9 8 12 14
样例输出
1
样例说明
其中一种最优选择方式:
队伍 1: {a1,a2,a3},队伍 2:{a4,a5},力量值和分别为 10+9+8=27 , 12+14=26,差距为 ∣27−26∣=1。
评测用例规模与约定
对于 20% 的评测用例,保证 n≤50 。
对于 100% 的评测用例,保证 n≤103,ai≤109 。
运行限制
语言 | 最大运行时间 | 最大运行内存 |
---|---|---|
C++ | 1s | 256M |
C | 1s | 256M |
Java | 3s | 512M |
Python3 | 10s | 512M |
PyPy3 | 10s | 512M |
Go | 5s | 512M |
JavaScript | 5s | 512M |
解释:
从中选出A段和B段
A=(a+s),B=(b+s),s为重复的,当进行相减时s被消掉,相当于只取a和b。
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
typedef long long ll;
const ll MAX = 1e4;
ll sum[MAX];
vector<ll> a;
int main()
{
ll n;
cin >> n;
for (int i = 1; i <= n; i++)
{
ll t;
cin >> t;
sum[i] = sum[i - 1] + t;
}
for (int i = 1; i <= n; i++)
{
for (int j = i; j <= n; j++)
{
a.push_back(sum[j] - sum[i - 1]);
}
}
sort(a.begin(), a.end());
ll ans = 9e18;
for (auto i = a.begin()+1; i != a.end(); i++)
{
ans = min(ans, *i-*(i-1));
}
cout << ans << endl;
return 0;
}