P10429 蓝桥杯 2024 省 B 拔河
题目描述
小明是学校里的一名老师,他带的班级共有 nnn 名同学,第 iii 名同学力量值为 aia_iai。在闲暇之余,小明决定在班级里组织一场拔河比赛。
为了保证比赛的双方实力尽可能相近,需要在这 nnn 名同学中挑选出两个队伍,队伍内的同学编号连续 {al1,al1+1,...,ar1−1,ar1}\{{a_{l_1}}, a_{l_1 + 1}, \dots, a_{r_1 - 1}, a_{r_1}\}{al1,al1+1,...,ar1−1,ar1} 和 {al2,al2+1,...,ar2−1,ar2}\{{a_{l_2}}, a_{l_2 + 1}, \dots, a_{r_2 - 1}, a_{r_2}\}{al2,al2+1,...,ar2−1,ar2},其中 l1≤r1<l2≤r2l_1 \le r_1<l_2 \le r_2l1≤r1<l2≤r2。
两个队伍的人数不必相同,但是需要让队伍内的同学们的力量值之和尽可能相近。请计算出力量值之和差距最小的挑选队伍的方式。
输入格式
输入共两行。
第一行为一个正整数 nnn。
第二行为 nnn 个正整数 a1,a2,...,ana_1, a_2, \dots ,a_na1,a2,...,an。
输出格式
输出共一行,一个非负整数,表示两个队伍力量值之和的最小差距。
输入输出样例 #1
输入 #1
5
10 9 8 12 14
输出 #1
1
说明/提示
样例 1 解释
其中一种最优选择方式:
队伍 111:{a1,a2,a3}\{a_1, a_2, a_3\}{a1,a2,a3},队伍 222:{a4,a5}\{a_4, a_5\}{a4,a5},力量值和分别为 10+9+8=2710 + 9 + 8 = 2710+9+8=27,12+14=2612 + 14 = 2612+14=26,差距为 ∣27−26∣=1|27 − 26| = 1∣27−26∣=1。
数据规模与约定
- 对 20%20\%20% 的数据,n≤50n \leq 50n≤50。
- 对全部的测试数据,保证 2≤n≤1032 \leq n \leq 10^32≤n≤103,1≤ai≤1091 \leq a_i \leq 10^91≤ai≤109。
C++实现
cpp
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e3 + 10;
int n;
long long a[maxn], ans = 1e9;
multiset<long long> S;
long long minnum(long long a, long long b) {
return a > b ? b : a;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i], a[i] = a[i - 1] + a[i];//前缀和维护
for (int i = 1; i <= n; i++)
for (int j = i; j <= n; j++)
S.insert(a[j] - a[i - 1]);//全部插入
for (int i = 1; i < n; i++) {
for (int j = i; j <= n; j++) {
auto p = S.find(a[j] - a[i - 1]);
S.erase(p);//删除
}
for (int j = 1; j <= i; j++) {
auto k = a[i] - a[j - 1];
auto p = S.lower_bound(k);
if (p != S.end())
ans = minnum(ans, abs(*p - k));
if (p != S.begin())
p --, ans = minnum(ans, abs(*p - k));
}
}
cout << ans;
return 0;
}

后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容