codeforces 1669F

题意:

alice和bob从数组两边的吃糖果, 数组的值就是糖果重量

要求alice和bob吃的糖果重量必须一样, 输出能吃几个糖果

这题最先想到的是前后缀相加

模拟一个前缀和 和 后缀和

在n/2的位置向前找前缀和 

在n/2的位置向后找后缀和 

找到第一个前缀和==后缀和的下标输出就好

但这种做法有个缺点, 因为前缀和对应相等的后缀和下标不一定是i与n-i的关系, 做起来还是需要用双指针, 那既然用了双指针, 而且前缀和 和 后缀和的访问次数只需要找到第一个(或者说, 最后一个)相等的就行

那为什么不用直接双指针模拟呢?就不需要前缀和这种繁琐的做法了, 还要多模拟一个数组

创建双指针l和r, 创建q和p分别储存alice和bob吃的糖果重量

每当alice吃的糖果小于bob的糖果时alice多吃, 否则bob多吃

每当两者相等时, 更新一下答案即可

void solve()
{
    cin>>n;
    vector<ll>v(n+1);
    for(int i=0;i<n;i++) cin>>v[i];
    ll l=0,r=n-1;
    ll q=0,p=0;
    ans=0;
    while(l<=r)
    {
        if(q<p) q+=v[l++];
        else p+=v[r--];
        if(p==q) ans=l+(n-1-r);
    }
    cout<<ans<<endl;
    return;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值