【題解】爬山 藍橋杯2024省B

watasky發表於2024-05-07

題目連結: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;
}

相關文章