题目链接
https://codeforces.com/problemset/problem/1352/D
题目描述
题意:两个人轮流吃数组,一个从左端开始(第一次只吃a[1]),另一个从右端开始,吃掉的元素和必须严格大于上一个人吃掉的元素和,数组全吃完时结束。输出回合数以及两人分别吃掉了多少。
解题思路
模拟题,模拟吃糖果的过程,注意下标不要越界就行:
left
记录Alice吃糖果的下标;right
记录Bob吃糖果的下标;last_sum
保存上一次吃糖果的值;cur_sum
保存当前小朋友累加的值。
P.S.编程过程中输出每位小朋友每个轮次吃掉的糖果,看是否和题目描述里的一致,可快速定位bug。
参考代码
#include <iostream>
using namespace std;
const int MAXN=10006;
int a[MAXN];
int main(){
int n,t;
int alice=0,bob=0;
scanf("%d",&t);
while(t--) {
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
alice = a[1];
bob = 0;
int left=2,right=n,round=1,last_sum=a[1];
//cout<<"Alice:"<<alice<<endl;
while( left <= right) {
//Bob
int cur_sum=0;
while( cur_sum <= last_sum && left <=right){
cur_sum += a[ right ];
right--;
}
//cout<<"Bob:"<<cur_sum<<endl;
round++;
bob += cur_sum;
last_sum = cur_sum;
cur_sum=0;
if( left>right ) break;
//Alice
while( cur_sum <= last_sum && left <=right){
cur_sum += a[ left ];
left++;
}
//cout<<"Alice:"<<cur_sum<<endl;
round++;
alice += cur_sum;
last_sum = cur_sum;
}
cout<<round<<" "<<alice<<" "<<bob<<endl;
}
return 0;
}