涉及知识点:
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;
}