F - 爱丽丝、鲍勃和巧克力

【题目描述】

他们把n个巧克力棒排成一行。爱丽丝开始从左到右一个接一个地吃巧克力棒,鲍勃——从右到左。对于每个巧克力棒,玩家食用它所需的时间是已知的(爱丽丝和鲍勃以相同的速度吃掉它们)。当玩家吃掉一块巧克力时,他会立即从另一块开始。不允许同时吃两块巧克力,不要让巧克力棒未吃完并暂停。如果两个玩家开始同时吃同一个酒吧,鲍勃把它留给爱丽丝作为一个真正的绅士。

【输入】

第一行包含一个整数 n (1 ≤ n ≤ 10 5) — 表格上的柱数。第二行包含一个序列 t 1, t 2, ..., tn (1 ≤ t i ≤ 1000),其中 t i 是消耗第 i 根柱所需的时间(以秒为单位)(按从左到右的顺序)。

【输出】

打印两个数字 a 和 b,其中 a 是 Alice 消耗的柱线数量,b 是 Bob 消耗的柱线数量。

解题思路

将right,left分别代表爱丽丝所在的位置和鲍勃所在的位置。

如果最后剩下一块巧克力,并且两人同时吃完当前的巧克力(sum1==sum2),这种情况将巧克力给爱丽丝,将right++后结束循环。

循环过程中:当sum1==sum2时,先让爱丽丝分得下一块巧克力,接着判断是否存在巧克力,存在的话让鲍勃分得下一块巧克力。sum1>sum2时,让鲍勃分得下一块巧克力,sum1

代码如下

#include
int a[100005];
int main() {
	int n;
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) {
		scanf("%d", &a[i]);
	}
	int right = 0, left = n+1;
	int sum1 = 0, sum2 = 0;
	//循环结束条件是right>=left
	while(right sum2) {
			left--;
			sum2 = sum2 + a[left];
		}
		else if (sum1 < sum2) {
			right++;
			sum1 = sum1 + a[right];
		}
	}
	printf("%d %d", right, n - left + 1);
	
}

你可能感兴趣的:(题组,学习,算法,思维)