这个题目是用了前缀和
对于一个已排序 的数组,任意两个不同元素的差值的最小值一定出现在某两个相邻元素之间。
但是如果只用前缀和而不进行优化的话,则会造成超时的情况
一开始我只用的前缀和然后计算出每一段的连续长度和,然后在进行枚举,但是最后提交的时候发现只过了一个样例然后其他都是超时】
所以我就看了题解,发现其中一个的做法是,计算出每一长度的连续前缀和之后对其排序然后在其相邻的两个元素之间找差值最小值
cpp
#include<iostream>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
typedef long long ll;
const int N=1010;
struct segment{
ll sum;
int l,r;
};
int n;
bool cmp(segment &a,segment &b)
{
return a.sum<b.sum;
}
ll a[N];
ll s[N];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
s[i]=s[i-1]+a[i];
}
vector<segment> seg;
for(int i=1;i<=n;i++)
{
for(int j=i;j<=n;j++)
{
seg.push_back({s[j]-s[i-1],i,j});
}
}
sort(seg.begin(),seg.end(),cmp);
int m=seg.size();
ll ans=5e10;
for(int i=0;i<m;i++)
{
for(int j=i+1;j<m;j++)
{
if(seg[j].sum-seg[i].sum>=ans)break;
if(seg[i].r<seg[j].l||seg[j].r<seg[i].l)
{
ans=min(ans,seg[j].sum-seg[i].sum);
}
}
}
cout<<ans<<endl;
return 0;
}