codeforces 1669F

一道标准的双指针,我感觉我都可以开一个双指针的专题了…
题目链接

题意

给定 n n n个糖果,权值为 a [ i ] a[i] a[i] a [ n ] a[n] a[n],分别从左右两个方向累加,问两边权值相等的情况下,总共消耗糖果最多是多少

思路

就是开个头指针,尾指针,前缀和等于后缀和时,头指针向前移动,尾指针向后移动,前缀和小于后缀和,累加前面的,反过来同理

ACcode

#include

using ll = long long;

using namespace std;

void solve()
{
    int n;cin >> n;
    vectora(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;
}

你可能感兴趣的:(codeforces,板刷二分,rating,1200,算法,图论)