吃糖果 - 题目 - Daimayuan Online Judge
题意:
桌子上从左到右放着 n 个糖果。糖果从左到右编号,第 i 块糖果的重量为 wi。小明和小红要吃糖果。
小明从左边开始吃任意数量的糖果。(连续吃,不能跳过糖果)
小红从右边开始吃任意数量的糖果。(连续吃,不能跳过糖果)
当然,如果小明吃了某个糖果,小红就不能吃它(反之亦然)。
他们的目标是吃同样重量的糖果,请问此时他们总共最多能吃多少个糖果?
思路:
思路十分自然,维护前缀和和后缀和,当前缀和==后缀和且前缀i小于后缀i时成立,维护最大值即可
Code:
#include <bits/stdc++.h>
using namespace std;
const int mxn=2e5+10;
#define int long long
unordered_map<int,int> mp;
int n,ans=0;
int w[mxn],pre[mxn],hou[mxn];
signed main(){
scanf("%lld",&n);
for(int i=1;i<=n;i++){
scanf("%lld",&w[i]);
pre[i]=pre[i-1]+w[i];
mp[pre[i]]=i;
}
for(int i=n;i>=1;i--) hou[i]=hou[i+1]+w[i];
//for(int i=1;i<=n;i++) printf("%d%c",pre[i],i==n?'\n':' ');
//for(int i=1;i<=n;i++) printf("%d%c",hou[i],i==n?'\n':' ');
for(int i=1;i<=n;i++){
if(mp[hou[i]]&&i>mp[hou[i]]) ans=max(ans,mp[hou[i]]+n-i+1);
}
printf("%lld\n",ans);
return 0;
}