解题思路:
使用前缀和计算每个区间,用结构体存储头和尾和大小,再根据大小排序,遍历结构体排序相邻且区间不交叉的记录大小差值,得出答案。
代码:
#include<bits/stdc++.h>
using namespace std;
int n;
long long dum[1005];
long long ansmin = 1e18;
struct node{
long long l,r,sum;
};
vector<node> v;
bool cmp(node a,node b){
return a.sum < b.sum;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
int num;
cin>>num;
dum[i] = num+dum[i-1];
}
for(int i=1;i<=n;i++)
{
for(int j=i;j<=n;j++){
v.push_back({i, j,dum[j]-dum[i-1]});
}
}
sort(v.begin(),v.end(),cmp);
for(int i=0;i<v.size()-1;i++){
if((v[i].l<v[i+1].l && v[i].r < v[i+1].l)||
(v[i+1].l<v[i].l && v[i+1].r<v[i].l))
ansmin = min(ansmin,abs(v[i].sum-v[i+1].sum));
}
cout<<ansmin;
return 0;
}