题意:将一个数组分成三部分,(每一部分都可以是空,但是三部分加起来一定要包含整个数组且不重合),求出每一部分元素的和,显然,第一部分的值和第三部分的值有可能是相同的(起码第一部分和第三部分是空集的时候他们相同),问第一部分的和与第三部分的和相同时,第一部分的和最大是多少.
很简单,先算一遍前缀和,再算一遍后缀和,然后二分查找后缀和中有没有前缀和中的元素.
#include<bits/stdc++.h>
using namespace std;
long long d[210000],a[210000],b[210000];
int main(){
int n;
cin>>n;
for(int i = 1;i <= n;i++)
{
scanf("%lld",&d[i]);
a[i]=a[i-1]+d[i];
}
for(int i = n;i>=1;i--)
{
b[i]=b[i+1]+d[i];
}
for(int i = n-1;i >= 1;i--)
{ int l = i+1,r = n;
while(l <= r)
{ int mid = (l+r)/2;
if(a[i] > b[mid])
{
r = mid-1;
}
else
if(a[i]<b[mid])
{
l = mid + 1;
}
else
if(a[i] == b[mid])
{
cout<<a[i]<<endl;
return 0;
}
}
}
cout<<"0"<<endl;
return 0;
}
如果一个数组有序,要查找数组中是否含有某个元素,用二分法