1 条题解
-
0
对于20%的数据,可以考虑枚举两个区间,利用前缀和计算区间和,复杂度 。
明显需要 的复杂度,考虑枚举一个区间,二分查找和该区间和最匹配的数据。
\begin{lstlisting} #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e3 + 5, INF = 0x3f3f3f3f, MOD = 1E9 + 7; ll n,a[N*N/2],s[N]; void solve1(){ ll ans=1e12; for(int l1=1; l1<n; l1++) for(int r1=l1; r1<n; r1++) for(int l2=r1+1; l2<=n; l2++) for(int r2=l2; r2<=n; r2++) ans = min(ans, abs(s[r2] - s[l2-1] - (s[r1] - s[l1-1])) ); cout<<ans<<endl; } void solve2(){ ll ans=1e12; set<ll> st;st.insert(1e12), st.insert(-1e12); for(int l=1; l<=n; l++){ for(int i=1; i<l; i++) st.insert( s[l-1] - s[i-1] ); // [i, l-1] for(int r=l; r<=n; r++){ ll sum = s[r] - s[l-1]; auto it = st.lower_bound(sum); ans = min(ans, *it - sum); --it; ans = min(ans, sum - *it); } } cout<<ans<<endl; } int main(){ cin>>n; for(int i=1; i<=n; i++) { cin>>a[i]; s[i] = s[i-1] +a[i]; } solve2(); }
- 1
信息
- ID
- 2021
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- 递交数
- 18
- 已通过
- 2
- 上传者