1 条题解
-
1
#include using namespace std;
int main() { int n, m, a[10005], sum = 0;
// 1. 首先读取测试用例组数 t。 // 为了不改变量名,我们暂时用变量 m 来存储这个 t (组数)。 if (!(cin >> m)) return 0; // 2. 循环处理每一组测试用例 while (m--) { cin >> n; // 读取当前组的序列长度 n sum = 0; // 重置总和 // 3. 读取 n 个数字到数组 a 中,并计算总和 // 原代码错误:这里原本是在循环里读 m 再读 a[i],逻辑全乱了。 // 修正:直接用 j 循环 n 次,读入 a[j] for (int j = 1; j <= n; j++) { cin >> a[j]; sum += a[j]; } // 4. 判断逻辑 // 如果总和是奇数,不可能平分 if (sum % 2 != 0) { cout << "No\n"; continue; } int f = 0; // f 作为标志位,0表示未找到,1表示找到 int current_sum = 0; // 这里借用 sum 的逻辑,但为了不破坏 sum 总值,我们需要一个临时累加器 int temp_sum = 0; a[0] = 0; // 用 a[0] 充当临时前缀和变量,这样就不需要新变量名了! for (int k = 1; k < n; k++) { // 分割点 i 从 1 到 n-1 a[0] += a[k]; // a[0] 现在存储的是前 k 项和 if (a[0] == sum / 2) { f = 1; break; } if (a[0] > sum / 2) { break; // 剪枝 } } if (f) { cout << "Yes\n"; } else { cout << "No\n"; } } return 0;}
- 1
信息
- ID
- 64
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- 递交数
- 13
- 已通过
- 4
- 上传者
粤公网安备44195502000252号