CodeForces 300A题C++代码无输出问题排查及解法求助
问题原因
- 局部计数变量未初始化:代码中
c1、c2、c3三个计数变量声明时未赋值为0,函数内局部自动变量默认值为内存随机垃圾值,后续累加操作值完全不可控,极易触发数组越界、程序崩溃,是无输出的直接原因。 - 逻辑存在漏洞:未处理正数集合为空的场景,题目要求第二个集合乘积必须为正,若原数组没有正数,当前代码会输出长度为0的正数集合,不符合题目要求。
修正后可运行代码
#include <bits/stdc++.h> using namespace std; #define endl "\n" #define ll long long int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); ll n; cin >> n; vector<ll> v(n); for (ll i = 0; i < n; i++) { cin >> v[i]; } ll c1 = 0, c2 = 0, c3 = 0; vector<ll> neg, pos, z; for (ll i = 0; i < n; i++) { if (v[i] == 0) { c3++; z.push_back(v[i]); } else if (v[i] < 0) { c1++; neg.push_back(v[i]); } else { c2++; pos.push_back(v[i]); } } // 调整负数个数为奇数,保证第一个集合乘积为负 if (c1 % 2 == 0) { ll neg_num = neg.back(); neg.pop_back(); c1--; z.push_back(neg_num); c3++; } // 处理正数为空的情况,两个负数乘积为正满足第二个集合要求 if (c2 == 0) { pos.push_back(neg.back()); neg.pop_back(); c1--; pos.push_back(neg.back()); neg.pop_back(); c1--; c2 += 2; } // 按格式输出 cout << c1 << " "; for (ll i = 0; i < c1; i++) { cout << neg[i] << " "; } cout << endl; cout << c2 << " "; for (ll i = 0; i < c2; i++) { cout << pos[i] << " "; } cout << endl; cout << c3 << " "; for (ll i = 0; i < c3; i++) { cout << z[i] << " "; } return 0; }
标准解题思路
题目要求将数组拆分为三个非空集合,满足第一个集合乘积为负、第二个为正、第三个为0,实现逻辑如下:
- 遍历原数组,将元素按负数、正数、零三类分别存入三个数组,同时统计每类的数量。
- 调整负数数组长度为奇数:如果负数总数是偶数,取一个负数放到零数组,保证第一个集合乘积为负。
- 处理无正数的特殊场景:如果正数数组为空,从负数数组取两个元素放到正数数组,两个负数相乘结果为正,满足第二个集合的乘积要求,同时剩余的负数个数仍为奇数,不会影响第一个集合的要求。
- 按格式输出三个集合的长度和对应元素即可。
内容的提问来源于stack exchange,提问作者TheBeast
相关产品推荐
相关产品推荐

