Week 1
2月19日
贝茜和埃尔茜发现了一行 N N N 个蛋糕( N N N 为偶数),大小依次为 a 1 , a 2 , … , a N a_1,a_2,…,a_N a1,a2,…,aN。
两头奶牛都想吃到尽可能多的蛋糕。
但是,作为非常文明的奶牛,她们决定玩一个游戏来分割蛋糕!
游戏在两头奶牛之间轮流进行回合。
每个回合进行以下两者之一:
- 贝茜选择两个相邻的蛋糕并将它们堆叠起来,制造大小为两者大小之和的一个新蛋糕。
- 埃尔茜选择最左边或最右边的蛋糕藏起来。
当只剩下一个蛋糕时,贝茜吃掉它,而埃尔茜吃掉她藏起来的所有蛋糕。
如果两头奶牛都采取最优策略以最大化她们吃到的蛋糕量,并且贝茜先进行回合,那么每头奶牛将会吃到多少蛋糕?
输入格式
每个测试点包含 T T T 个独立的测试用例。
每个测试用例的格式如下。
第一行包含 N N N。
下一行包含 N N N 个空格分隔的整数 a 1 , a 2 , … , a N a_1,a_2,…,a_N a1,a2,…,aN。
输出格式
对于每个测试用例,输出一行,包含 b b b 和 e e e,表示贝茜和埃尔茜在两头奶牛都采取最优策略的情况下分别吃到的蛋糕量。
数据范围
1 ≤ T ≤ 10 1 \le T \le 10 1≤T≤10,
2 ≤ N ≤ 5 × 1 0 5 2 \le N \le 5 \times 10^5 2≤N≤5×105,
1 ≤ a i ≤ 1 0 9 1 \le a_i \le 10^9 1≤ai≤109,
输入保证一个测试点中的所有 N N N 之和不超过 1 0 6 10^6 106。
输入样例:
2
4
40 30 20 10
4
10 20 30 40
输出样例:
60 40
60 40
样例解释
对于第一个测试用例,在最优策略下,
- 贝茜将堆叠中间两个蛋糕。现在蛋糕的大小为 [ 40 , 50 , 10 ] [40,50,10] [40,50,10]。
- 埃尔茜将吃掉最左边的蛋糕。现在剩余的蛋糕的大小为 [ 50 , 10 ] [50,10] [50,10]。
- 贝茜堆叠剩余的两个蛋糕。
贝茜将吃到 30 + 20 + 10 = 60 30+20+10=60 30+20+10=60 的蛋糕,而埃尔茜将吃到 40 40 40 的蛋糕。
第二个测试用例是第一个测试用例反转的情况,因此答案相同。
思路:
贪心 + 前缀和
code:
t = int(input())
for _ in range(t):
n = int(input())
a = list(map(int, input().split()))
pre_sum = [0] * (n + 1)
for i in range(1, n + 1):
pre_sum[i] = pre_sum[i - 1] + a[i - 1]
ans = float('inf')
len = n // 2 + 1
for i in range(len, n + 1):
ans = min(ans, pre_sum[i] - pre_sum[i - len])
print(ans, sum(a) - ans)
END
如果有更多问题或需要进一步的帮助,可以在评论区留言讨论哦!
如果喜欢的话,请给博主点个关注 谢谢