1 条题解
- 
  1
#include <cstdio> #include <iostream> #include <cstring> #include <algorithm> using namespace std; const int N = 500010; long long int a[N], s[N]; // a[i]表示第i个蛋糕的大小,s[i]表示前i个蛋糕的大小之和 int n, t; long long int ans1, ans2; // ans1表示贝茜拿走的蛋糕大小之和,ans2表示埃尔茜拿走的蛋糕大小之和 int main() { scanf("%d", &t); while (t--) { ans1 = 0, ans2 = 0; // 初始化ans1和ans2 scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%Ld", &a[i]); s[i] = s[i - 1] + a[i]; // 预处理前缀和 } int cnt = (n - 2) / 2; // 计算埃尔茜需要拿走的蛋糕数量 int i = 1, j = n; // 记录贝茜拿走的蛋糕范围 for (int k = 0; k <= cnt; k++) // 枚举埃尔茜拿走的蛋糕的所有可能情况 { // 从左边开始拿k个蛋糕,总和为s[k] // 从右边开始拿cnt-k个蛋糕,总和为s[n] - s[n - cnt + k] long long int sum = s[k] + s[n] - s[n - cnt + k]; // 计算埃尔茜拿走的总蛋糕大小 if (sum > ans2) // 如果当前情况比之前的情况更优 { ans2 = sum; // 更新答案 i = k + 1, j = n - cnt + k; // 计算更新贝茜拿走的蛋糕范围(如果利用ans2求ans1就不用存范围了) } } ans1 = s[j] - s[i - 1]; // 计算贝茜拿走的蛋糕大小之和(也可写为ans1 = s[n] - ans2;) printf("%Ld %Ld\n", ans1, ans2); } return 0; } 
- 1
 
信息
- ID
 - 5553
 - 时间
 - 1000ms
 - 内存
 - 256MiB
 - 难度
 - 10
 - 标签
 - 递交数
 - 7
 - 已通过
 - 2
 - 上传者