题目链接:ADV-381 分割项链
本题使用双指针算法,记所有价值总和接近总价值一半的区间,最多有n个区间,所以循环终止条件为num = n
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 50010;
int n;
int a[N];
int main()
{
cin >> n;
int w_sum = 0; //项链的价值总和
for(int i = 0; i < n; i ++ )
{
scanf("%d", &a[i]);
w_sum += a[i];
}
w_sum /= 2;//项链价值总和的一半
int res = 0, n_sum = 0, num = 0;//记录答案,记录当前价值总和,记录区间个数
int l = 0, r = 0;
while(1)
{
while(n_sum < w_sum)
{
n_sum += a[r%n];
r ++;
}
while(n_sum > w_sum)
{
n_sum -= a[l % n];
l ++;
}
res = max(res, n_sum);
num ++;
if(num == n) break;
}
printf("%d\n", res);
return 0;
}