一道标准的双指针,我感觉我都可以开一个双指针的专题了…
题目链接
给定 n n n个糖果,权值为 a [ i ] a[i] a[i]到 a [ n ] a[n] a[n],分别从左右两个方向累加,问两边权值相等的情况下,总共消耗糖果最多是多少
就是开个头指针,尾指针,前缀和等于后缀和时,头指针向前移动,尾指针向后移动,前缀和小于后缀和,累加前面的,反过来同理
#include<bits/stdc++.h>
using ll = long long;
using namespace std;
void solve()
{
int n;cin >> n;
vector<int>a(n + 3);
for (int i = 1;i <= n;i++)cin >> a[i];
int bp = 1;int lp = n;
int bs = 0;int ls = 0;
int ans = -1;
bs += a[bp];
ls += a[lp];
while (bp < lp) {
while (bs == ls && bp < lp) {
bp++;lp--;
bs += a[bp];
ls += a[lp];
ans = max(ans, n - (lp - bp) - 1);
}
while (bs > ls && bp < lp) {
lp--;
ls += a[lp];
}
while (bs < ls && bp < lp) {
bp++;
bs += a[bp];
}
}
if (ans == -1)cout << 0 << '\n';
else cout << ans << '\n';
}
int main() {
int t;cin >> t;
while (t--) {
solve();
}
return 0;
}