5.10每日一题题解

Alice, Bob and Candies

涉及知识点:

  • 思维/双指针

solution

  • (我们可以发现Alice是从左向右,Bob是从右向左进行吃糖果 ,这样的问题我们可以用双指针来做(不知道双指针的同学,可以百度了解一下))
  • (即然要使用双指针那么, 就要考虑一个问题)
  • (临界点是在哪?)
  • (通过分析题意,我们可以很轻松的得到, 临界点在于两个指针相等的时候,即在相等的时候判断结束)

代码

#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll ar[10010];
int main()
{
    ll n , m ;
    cin >>n;
    while(n--){
        cin >>m;
        for(int i=1;i<=m;i++)cin >>ar[i];
        ll a= ar[1], b=0;//a 是Alice吃的糖果总数, b是Bob吃的糖果总数
        ll aa = a, bb =0;//aa 是Alice吃一次的数量, b是Bob吃一次的数量
        ll num =0 ;//num是这个活动进行的总次数
        ll l =2, r =m;//因为第一个Alice已经吃了, 所以从第二个开始
        int flag =0;//判断现在是谁的回合
        while(l<=r){
            if(aa<=bb&&!flag){//Alice回合时候Alice目前吃的糖果少于上一次Bob吃的数量
                aa +=ar[l];
                a+=ar[l++];
            }
            else if(bb<=aa&&flag){//同理
                bb +=ar[r];
                b+=ar[r--];
            }
            if(aa>bb&&!flag){//Alice当前已经符合题目上说的条件可以轮到Bob
                num ++ ;flag =1 ;
                bb =0 ;
            }
            else if(bb>aa&&flag)
            {//同理
                num ++ ;
                flag=0 ;
                aa=0 ;
            }

        }
        if(aa!=0 && bb!=0){//临界点判断
            num++;
        }
        if(m==1){//只有一个糖果的情况
            num++;
        }
        cout<< num <<" "<<a<<" "<<b<<endl;
    }
    return 0;
}

原文地址:https://www.cnblogs.com/QFNU-ACM/p/12862736.html