AcWing 5990. 拔河
原题链接
中等
作者:
elvisag
,
2025-04-04 20:50:21
· 广东
,
所有人可见
,
阅读 17
将左边队列的所有情况都加进去,然后用再右边队列中用multiset逐个比较
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int N=2e3+10;
int a[N];
int sum[N];
void solve()
{ multiset<int> q;
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
sum[i]=sum[i-1]+a[i];
}
int ans=0x3f3f3f3f;
int i=0,j=1;
for(int l=2;l<=n;l++)
{
for(int i=1;i<=l-1;i++)
q.insert(sum[l-1]-sum[i-1]);
for(int r=l;r<=n;r++)
{
int k=sum[r]-sum[l-1];
auto it=q.lower_bound(k);
if(it!=q.end()) ans=min(ans,abs(*it-k));
if (it != q.begin()) {
--it;
ans = min(ans, abs(*it - k));
}
}
}
cout<<ans<<endl;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
solve();
return 0;
}