題目連結:P10429 [藍橋杯 2024 省 B] 拔河
[藍橋杯 2024 省 B] 拔河
題目描述
小明是學校裡的一名老師,他帶的班級共有 \(n\) 名同學,第 \(i\) 名同學力量值為 \(a_i\)。在閒暇之餘,小明決定在班級裡組織一場拔河比賽。
為了保證比賽的雙方實力盡可能相近,需要在這 \(n\) 名同學中挑選出兩個隊伍,隊伍內的同學編號連續 \(\{{a_{l_1}}, a_{l_1 + 1}, \dots, a_{r_1 - 1}, a_{r_1}\}\) 和 \(\{{a_{l_2}}, a_{l_2 + 1}, \dots, a_{r_2 - 1}, a_{r_2}\}\),其中 \(l_1 \le r_1<l_2 \le r_2\)。
兩個隊伍的人數不必相同,但是需要讓隊伍內的同學們的力量值之和儘可能相近。請計算出力量值之和差距最小的挑選隊伍的方式。
輸入格式
輸入共兩行。
第一行為一個正整數 \(n\)。
第二行為 \(n\) 個正整數 \(a_1, a_2, \dots a_n\)。
輸出格式
輸出共一行,一個非負整數,表示兩個隊伍力量值之和的最小差距。
樣例 #1
樣例輸入 #1
5
10 9 8 12 14
樣例輸出 #1
1
提示
樣例 1 解釋
其中一種最優選擇方式:
隊伍 1:\(\{a_1, a_2, a_3\}\),隊伍 2:\(\{a_4, a_5\}\),力量值和分別為 \(10 + 9 + 8 = 27\),\(12 + 14 = 26\),差距為 \(|27 − 26| = 1\)。
資料規模與約定
- 對 \(20\%\) 的資料,\(n \leq 50\)。
- 對全部的測試資料,保證 \(1 \leq n \leq 10^3\),\(1 \leq a_i \leq 10^9\)。
解法:
把所有以i(\(1 \leq i \leq n\))開頭的區間暴力出來,進行排序,因為要找最小差值,排序後,相鄰的一定是差最小的,所以按每個區間的值從小到大排序,然後對相鄰區間取差值找最小差值。
程式碼:
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
const int N=1010;
int n,a[N],s[N],res=1e18;
vector<pii>v;
signed main()
{
scanf("%lld",&n);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
s[i]=s[i-1]+a[i];
}
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
v.push_back({s[j]-s[i],i});
}
}
sort(v.begin(),v.end());
for(int i=0;i<v.size()-1;i++)
{
res=min(res,v[i+1].first-v[i].first);
}
printf("%lld",res);
return 0;
}