代码源每日一题div2 吃糖果

吃糖果 - 题目 - 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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值