1 条题解

  • 1
    @ 2026-8-28 19:55:10

    #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
    上传者